7

说我有一个父类

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。这是为什么?

谢谢你。

4

2 回答 2

5

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

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

于 2013-06-04T19:10:05.283 回答
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.

于 2013-06-04T19:07:07.340 回答