PHP:通过parent :: method()vs $ this-> method()从子类调用方法的差异

时间:2013-06-04 19:04:32

标签: php

说我有一个父类

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,也不会收到任何警告。那是为什么?

谢谢。

2 个答案:

答案 0 :(得分:5)

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

请参阅https://stackoverflow.com/a/13875728/476

答案 1 :(得分:3)

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明确地处理属性。