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

php
2022-08-30 07:31:32

起初我很困惑为什么构造函数中的两个方法调用都有效,但现在我想我明白了。扩展类继承父级的方法,就好像它们是在类本身中声明的一样,并且这些方法存在于父级中,因此两者都应该有效。

现在我想知道是否有一种首选方法(即最佳实践)来调用该方法(via or ),以及这些方法是否是执行相同代码的真正相同的方式,或者在使用一种代码时是否有任何警告。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

有三种情况(我能想到的),您可以在其中调用子类中的方法,其中方法退出父类:

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

    这与您的示例相同,通常最好使用您是对的,在这种情况下,两者实际上是相同的,但是该方法已被子类继承,因此没有理由进行区分。通过使用,您可以在继承的方法和本地声明的方法之间保持一致。$this -> get_species();$this

  2. 方法被子类覆盖,并且具有与父类完全唯一的逻辑。

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

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

    在这种情况下,您仍然希望在从子类的其他方法调用该方法时使用。您将调用父方法的一个位置将来自覆盖父方法的方法。例:`$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.";
         }
    }
    

我能想象到的唯一需要直接在重写方法之外调用父方法的情况是,如果他们做了两件不同的事情,并且你知道你需要父方法的版本,而不是本地版本。情况不应该是这样,但是如果它确实出现了,那么解决这个问题的干净方法是创建一个新方法,其名称类似于它所做的只是调用父方法:get_parentSpecies()

function get_parentSpecies(){

     parent::get_species();
}

同样,这保持了一切的美好和一致性,允许对本地方法进行更改/修改,而不是依赖于父方法。


答案 2

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

当您使用$this它实际上是您创建的对象的一部分,因此也将始终是最新的(如果正在使用的属性在对象的生存期内以某种方式更改),而使用父类则调用静态类方法。


推荐