Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的抽象类_Php_Oop_Inheritance_Abstract Class - Fatal编程技术网

php中的抽象类

php中的抽象类,php,oop,inheritance,abstract-class,Php,Oop,Inheritance,Abstract Class,下面我有一些代码 /*abstract*/ class Animal{ protected $name; protected $legs; public function setName($name){ $this->name = $name; } public function getName(){ return $this->name; } // abstract public fun

下面我有一些代码

/*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);    
我想,如果不使用abstract,那么最后一行$t->check($cro)肯定是错的,但为什么它运行得很好呢。
我想问一个问题,用check方法进行课堂测试,$a->sound();动物体内不存在,但它仍在运行。它运行起来就像我打开comment抽象类一样,两者并没有什么不同。我真的很想知道,也许我对这个问题的理解是错误的,我们谈论的是动物和特定的动物,比如猫和鳄鱼。虽然在你的定义中,动物的概念与声音的方法无关,但从动物遗传而来的特定动物,如猫和鳄鱼,具有声音的能力。这就是你从更一般到更具体的过程。最后你会得到更多的细节


您的
动物
有一个
受保护的
$name
成员以及一个getter和setter。它们很有用,因为您不必为
鳄鱼
重新定义它们。但是你可以告诉
动物
,你不知道
声音
方法在细节上会是什么样子,但是你知道所有
动物
都能发出
声音
。这就是为什么
抽象的
:您可以实现它的一部分,但有些事情不能在
动物
级别实现,因为不同类型的动物会有不同类型的声音。

方法
声音
存在于
鳄鱼
类中。这就是它运行的原因。但在动物中没有,并且在
鳄鱼
类对象上运行带有animal的参数check方法。此对象具有
声音
方法。无论
Animal
是否有此方法,如果子类中存在此方法,都无关紧要。那么,为什么世界上存在抽象,而我们没有使用它,但仍在运行。像这样,我不能在《动物号》中定义声音()problem@KIM,这些只是设置或获取值的功能的名称。例如,name的setter是setName,name的getter是getName