假设我有一个父类
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
显式地处理属性