У меня есть код нижеабстрактный класс в PHP
/*abstract*/ class Animal{
protected $name;
protected $legs;
public function setName($name){
$this->name = $name;
}
public function getName(){
return $this->name;
}
// abstract public function sound();
}
class Cat extends Animal{
public function sound(){
echo 'Meo meo meo';
}
}
class Crocodile extends Animal{
public function sound(){
echo 'Never hear it';
}
}
function check(Animal $a){
echo $a->getName();br();
echo $a->sound();br();
}
$cat = new Cat();
$cat->setName("Cat");
$cro = new Crocodile();
$cro->setName('Nothing');
class test{
public function check(Animal $a){
echo $a->getName();
echo $a->sound();
}
}
$t = new test();
$t->check($cro);
Я думаю, если не использовать абстрактные поэтому последняя строка $ t-> чек ($ CRO) должны неправильно, но почему он работать хорошо. Я хочу задать вопрос, в классе тест с методом проверки, $ a-> sound(); в Animal нет, но он все еще работает. Он работает, как при открытии абстрактного класса комментариев, и то и другое не отличается. Я действительно удивляюсь, может быть, я ошибался, понимал эту проблему, скрутил
Метод 'sound' существует в классе' Крокодил'. Вот почему он работает. –
, но нет у животных, а параметр с Animal – KIM
Вы запускаете метод проверки объекта класса «Крокодил». Этот объект имеет «звуковой» метод. Не имеет значения, имеет ли этот метод «Animal» этот метод или нет, если метод существует в дочернем классе. –