You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
1.9 KiB
88 lines
1.9 KiB
<?php
|
|
/**
|
|
* 还不能掌握什么是协变
|
|
* 创建了一个animal的抽象类,留了speak叫这个动作给子类具体化
|
|
* 创建一个dog类,继承了animal类,并且具体化了叫这个类,狗会吠,猫会喵
|
|
*/
|
|
|
|
abstract class Animal{
|
|
protected string $name;
|
|
|
|
public function __construct(string $name){
|
|
$this->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);
|
|
|
|
?>
|