PHP:通过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.这是为什么?

谢谢.

解决方法:

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显式地处理属性.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...