PHP:通过parent::method()与$this->method()从子类调用方法的区别


PHP: differences in calling a method from a child class through parent::method() vs $this->method()

假设我有一个父类

class parentClass {
    public function myMethod() {
        echo "parent - myMethod was called.";
    }
}

和下面的子类

class childClass extends parentClass {
    public function callThroughColons() {
        parent::myMethod();
    }
    public function callThroughArrow() {
        $this->myMethod();
    }
}
$myVar = new childClass();
$myVar->callThroughColons();
$myVar->callThroughArrow();

使用两种不同的方式从继承类中调用myMethod()有什么不同?我能想到的唯一区别是,如果childClass用自己的版本覆盖myMethod(),但是还有其他明显的区别吗?

我认为双冒号操作符(::)应该只用于调用静态方法,但在调用$myVar->callThroughColons()时,我没有得到任何警告,即使有E_STRICT和E_ALL on。为什么呢?

谢谢。

在这种情况下没有区别。如果父类和子类都实现了myMethod,那么确实会产生影响。在这种情况下,$this->myMethod()调用当前类的实现,而parent::myMethod()显式调用父类的方法实现。parent::是针对这种特殊调用的特殊语法,它与静态调用无关。它可以说是丑陋和/或令人困惑的。

见https://stackoverflow.com/a/13875728/476 .

self::parent::static::为特殊情况。它们总是表现得好像你要做一个非静态调用,并且也支持静态方法调用,而不会抛出E_STRICT

只有在使用类名而不是那些相对标识符时才会出现问题。

可以这样写:

class x { public function n() { echo "n"; } }
class y extends x { public function f() { parent::n(); } }
$o = new y;
$o->f();

class x { public static function n() { echo "n"; } }
class y extends x { public function f() { parent::n(); } }
$o = new y;
$o->f();

class x { public static $prop = "n"; }
class y extends x { public function f() { echo parent::$prop; } }
$o = new y;
$o->f();

但是行不通的是:

class x { public $prop = "n"; }
class y extends x { public function f() { echo parent::prop; } } // or something similar
$o = new y;
$o->f();

您仍然需要使用$this显式地处理属性