在PHP中调用父方法的多种方式

起初,我很困惑为什么在构造函数中的两个方法调用工作,但现在我想我明白了。 扩展类inheritance父类的方法,就好像它们在类本身中声明的一样,并且方法存在于父类中,所以两者都应该工作。

现在我想知道是否有一个首选的方法(即最佳实践)调用方法(通过parentthis ),以及这些是否是真正相同的方式来执行相同的代码,或者如果有任何警告一个在另一个。

对不起,我可能在想这个。

 abstract class Animal { function get_species() { echo "test"; } } class Dog extends Animal { function __construct(){ $this->get_species(); parent::get_species(); } } $spike = new Dog; 

有三种情况(我可以想到)你可以在子类中调用一个方法,方法在父类中退出:

  1. 方法不会被子类覆盖,只存在于父类中。

    这和你的例子是一样的,通常最好使用$this -> get_species(); 你是对的,在这种情况下,两者实际上是一样的,但是这个方法已经被子类inheritance了,所以没有理由去区分。 通过使用$this您可以在inheritance的方法和本地声明的方法之间保持一致。

  2. 方法被子类覆盖,并且具有来自父类的完全独特的逻辑。

    在这种情况下,你显然想要使用$this -> get_species(); 因为你不希望执行父方法的版本。 同样,通过持续使用$this ,您不必担心这种情况与第一种情况的区别。

  3. 方法扩展了父类,增加了父方法实现的function。

    在这种情况下,你仍然想使用`$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."; } } 

唯一的情况是我可以想象,如果你需要直接在重写方法之外调用父方法,那么他们会做两件不同的事情,而且你知道你需要父方法的版本,而不是本地方法。 这不应该是这种情况,但是如果它确实存在,那么干净的方法就是创build一个名为get_parentSpecies()的新方法,它只需调用父方法即可:

 function get_parentSpecies(){ parent::get_species(); } 

同样,这样可以保持一切的一致性,允许对本地方法进行更改/修改,而​​不是依赖父方法。

除非我误解了这个问题,否则我几乎总是使用$ this-> get_species,因为子类(在这种情况下是dog)可能覆盖该方法,因为它扩展了它。 如果class级狗没有重新定义方法,那么这两种方法在function上是等价的,但是如果在将来的某个时候你决定要在狗中使用get_species方法,应该打印“狗”,那么你将不得不通过所有的代码更改。

当你使用$ this的时候,它实际上是你创build的对象的一部分,所以也总是最新的(如果被使用的属性在对象的生命周期中发生了某种变化),而使用父类正在调用静态类方法。