覆盖类常量与属性

Tom*_*ger 91 php oop inheritance overriding constants

我想更好地理解为什么在下面的场景中,类常量被继承的方式与实例变量的方式不同.

<?php
class ParentClass {
    const TEST = "ONE";
    protected $test = "ONE";

    public function showTest(){
        echo self::TEST;
        echo $this->test;
    }
}

class ChildClass extends ParentClass {
    const TEST = "TWO";
    protected $test = "TWO";

    public function myTest(){
        echo self::TEST;
        echo $this->test;
    }
}

$child = new ChildClass();
$child->myTest();
$child->showTest();
Run Code Online (Sandbox Code Playgroud)

输出:

TWO
TWO
ONE
TWO
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,ChildClass没有showTest()方法,因此继承使用ParentClass showTest()方法.结果显示,由于该方法在ParentClass上执行,因此正在评估TEST常量的ParentClass版本,而因为它通过继承在ChildClass上下文中进行评估,所以正在评估ChildClass成员变量$ test.

我已经阅读了文档,但似乎没有看到任何提及这种细微差别.任何人都可以为我解释一下吗?

Dav*_*ell 179

self::是不是继承意识,并始终指向它正在被执行的类.如果你正在使用PHP5.3 +你可以尝试static::TESTstatic::是继承意识.

不同之处在于static::使用"后期静态绑定".在此处查找更多信息:

http://php.net/manual/en/language.oop5.late-static-bindings.php

这是我写的一个简单的测试脚本:

<?php

class One
{
    const TEST = "test1";

    function test() { echo static::TEST; }
}
class Two extends One
{
    const TEST = "test2";
}

$c = new Two();

$c->test();
Run Code Online (Sandbox Code Playgroud)

产量

test2
Run Code Online (Sandbox Code Playgroud)

  • +提到`static ::`. (19认同)
  • 既然`test()`不是静态方法,为什么不用PHP5.3 +使用`$ this :: TEST`? (3认同)

w00*_*w00 14

在PHP中,self指的是定义被调用方法或属性的类.所以你的情况你打电话selfChildClass,所以它使用变量从该类.然后你使用selfin ParentClass,所以它将引用该类中的变量.

如果您仍希望子类覆盖const父类,则将父类中的以下代码调整为:

public function showTest(){
    echo static::TEST;
    echo $this->test;
}
Run Code Online (Sandbox Code Playgroud)

注意static关键字.这是使用"后期静态绑定".现在你的父类将调用你的子类的const.