<?php
class Food {}
class AnimalFood extends Food {}
abstract class Animal
{
protected string $name;
public function __construct(string $name)
{
$this->name = $name;
}
public function eat(AnimalFood $food)
{
echo $this->name." nom noms ".get_class($food);
}
}
class Cat extends Animal {}
class Dog extends Animal {
// The dog doesn't care if it's animal food, it'll eat ANY food
public function eat(Food $food) {
echo $this->name . " nom noms " . get_class($food);
}
}
interface AnimalShelter
{
public function adopt(string $name): Animal;
}
class CatShelter implements AnimalShelter
{
public function adopt(string $name): Cat
{
return new Cat($name);
}
}
class DogShelter implements AnimalShelter
{
public function adopt(string $name): Dog
{
return new Dog($name);
}
}
$kitty = (new CatShelter)->adopt("Ricky");
$catFood = new AnimalFood();
$kitty->eat($catFood);
echo "\n";
$doggy = (new DogShelter)->adopt("Mavrick");
$bananaPeel = new Food();
$doggy->eat($bananaPeel);
echo "\n";
$kitty->eat($bananaPeel);
Ricky nom noms AnimalFood
Mavrick nom noms Food
Fatal error: Uncaught TypeError: Animal::eat(): Argument #1 ($food) must be of type AnimalFood, Food given, called in /in/UkMYt on line 64 and defined in /in/UkMYt:16
Stack trace:
#0 /in/UkMYt(64): Animal->eat(Object(Food))
#1 {main}
thrown in /in/UkMYt on line 16
Process exited with code 255.
Output for 8.3.5
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
Ricky nom noms AnimalFood
Mavrick nom noms Food
Fatal error: Uncaught TypeError: Animal::eat(): Argument #1 ($food) must be of type AnimalFood, Food given, called in /in/UkMYt on line 64 and defined in /in/UkMYt:16
Stack trace:
#0 /in/UkMYt(64): Animal->eat(Object(Food))
#1 {main}
thrown in /in/UkMYt on line 16
Process exited with code 255.
Output for 7.4.0 - 7.4.33
Ricky nom noms AnimalFood
Mavrick nom noms Food
Fatal error: Uncaught TypeError: Argument 1 passed to Animal::eat() must be an instance of AnimalFood, instance of Food given, called in /in/UkMYt on line 64 and defined in /in/UkMYt:16
Stack trace:
#0 /in/UkMYt(64): Animal->eat(Object(Food))
#1 {main}
thrown in /in/UkMYt on line 16
Process exited with code 255.
Output for 7.2.0 - 7.2.33, 7.3.0 - 7.3.33
Parse error: syntax error, unexpected 'string' (T_STRING), expecting function (T_FUNCTION) or const (T_CONST) in /in/UkMYt on line 9
Process exited with code 255.