微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐