说我有一个父类
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,也不会收到任何警告。那是为什么?
谢谢。
答案 0 :(得分:5)
在这种情况下它没有任何区别。如果父类和子类都实现myMethod
, 会有所不同。在这种情况下,$this->myMethod()
调用当前类的实现,而parent::myMethod()
显式调用父方法的实现。 parent::
是这种特殊调用的特殊语法,它与静态调用无关。它可以说是丑陋和/或令人困惑。
答案 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
明确地处理属性。