起初我很困惑为什么构造函数中的两个方法调用都工作,但现在我想我明白了.扩展类继承父类的方法,就像它们在类本身中声明一样,并且方法存在于父类中,因此两者都应该有效.
现在我想知道是否有一种调用方法的优选方式(即最佳实践)(通过parent
或this
),以及这些是否是执行相同代码的真正相同的方式,或者在使用方法时是否有任何警告另一个.
对不起,我可能在想这个.
abstract class Animal {
function get_species() {
echo "test";
}
}
class Dog extends Animal {
function __construct(){
$this->get_species();
parent::get_species();
}
}
$spike = new Dog;
Run Code Online (Sandbox Code Playgroud)
Ant*_*ony 102
有三种情况(我可以想到),您可以在子类中调用方法,其中方法在父类中退出:
方法不会被子类覆盖,只存在于父类中.
这与你的例子相同,通常最好使用$this -> get_species();
你是正确的,在这种情况下,两者实际上是相同的,但该方法已被子类继承,因此没有理由区分.通过使用$this
您在继承的方法和本地声明的方法之间保持一致.
方法被子类覆盖,并且具有来自父类的完全唯一的逻辑.
在这种情况下,您显然想要使用,$this -> get_species();
因为您不希望执行父方法的版本.同样,通过持续使用$this
,您无需担心此案例与第一个案例之间的区别.
方法扩展父类,添加父方法实现的内容.
在这种情况下,您仍然希望`$this -> get_species();
在从子类的其他方法调用方法时使用.您将调用父方法的一个位置将来自覆盖父方法的方法.例:
abstract class Animal {
function get_species() {
echo "I am an animal.";
}
}
class Dog extends Animal {
function __construct(){
$this->get_species();
}
function get_species(){
parent::get_species();
echo "More specifically, I am a dog.";
}
}
Run Code Online (Sandbox Code Playgroud)我可以想象的唯一场景就是你需要在覆盖方法之外直接调用父方法,如果他们做了两件不同的事情,你知道你需要父方法的版本,而不是本地版本.这不应该是这种情况,但如果它确实存在,那么接近这个的干净方法是创建一个名称的新方法,就像get_parentSpecies()
它所做的一样是调用父方法:
function get_parentSpecies(){
parent::get_species();
}
Run Code Online (Sandbox Code Playgroud)
同样,这使得一切都保持良好和一致,允许对本地方法进行更改/修改,而不是依赖于父方法.
除非我误解了这个问题,否则我几乎总是使用$ this-> get_species,因为子类(在本例中为dog)可以覆盖该方法,因为它确实扩展了它.如果类狗没有重新定义该方法,那么两种方式在功能上是等价的,但如果在将来的某个时候你决定你想要狗中的get_species方法应该打印"dog",那么你将不得不返回所有的代码和更改.
当你使用$ this时,它实际上是你创建的对象的一部分,因此它也总是最新的(如果使用的属性在对象的生命周期中以某种方式改变了),而使用父类正在调用静态类方法.