在php中的抽象类

时间:2016-06-26 15:06:45

标签: 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 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-> check($ cro)一定是错的,但为什么它运行得很好。 我想问一个问题,在课堂测试中用check方法,$ a-> sound();动物中没有,但它仍在运行。它像我打开评论抽象类时那样运行,两者都没有区别。我真的好奇,也许我错了解这个问题,扭曲了

1 个答案:

答案 0 :(得分:1)

我们谈论的是动物和特定动物,如猫和鳄鱼。虽然在你的定义中,动物的概念与声音的方法无关,但从动物遗传的特定动物,如猫和鳄鱼,具有声音的能力。这就是你从更一般到更具体的方式。最后你会得到更多的特殊性。

您的Animal class有一名protected $name成员以及一名获取者和一名二传手。它们非常有用,因为您无需为CrocodileCat重新定义这些内容。但是你可以告诉Animal class你不知道sound方法在详细情况下会是什么样子,但你知道所有Animals都可以制作一个sound 1}}。这就是classabstract的原因:您可以实现其中的一部分,但有些事情无法在Animal级别实施,因为不同类型的动物会有不同类型的声音