name=$name; } abstract public function speak(); } class Dog extends Animal{ public function speak(){ echo $this -> name." barks".PHP_EOL; } } class Cat extends Animal{ public function speak(){ echo $this->name." meows".PHP_EOL; } } $doggy=new Dog("旺财"); $doggy->speak(); 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"); $kitty->speak(); $doggy=(new DogShelter)->adopt("lucky"); $doggy->speak(); 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."eats".get_class($food); } } class Dog extends Animal{ public function eat(Food $food){ echo $this->name."eats".get_class($food); } } $kitty=(new CatShelter)->adopt("ricky"); $catFood=new AnimalFood(); $kitty->eat($catFood).PHP_EOL; $doggy=(new DogShelter)->adopt("lucky"); $banana=new Food(); $doggy->eat($banana); ?>