覆盖类常量VS性能(Overriding class constants vs properties

2019-07-04 05:27发布

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

<?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();

输出:

TWO
TWO
ONE
TWO

在上面的代码,ChildClass不具有showTest()方法,所以在父类showTest()方法用于通过继承。 结果表明,由于该方法是在父类执行时,TEST恒定的父类版本正被评估的,而因为它通过继承ChildClass上下文中评估,所述ChildClass成员变量$测试被评价。

我读过的文件,但似乎无法看到这种细微的任何提及。 任何人都可以提供一些线索给我吗?

Answer 1:

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();

产量

test2


Answer 2:

在PHP中,自我是指其中所调用的方法或属性定义的类。 所以你的情况你调用selfChildClass ,所以它使用变量从该类。 然后你用selfParentClass ,所以那么它西港岛线是指变量在类。

如果你仍然想在子类覆盖const父类的,然后调整你的父类下面的代码如下:

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

注意static关键字。 这是使用“后期静态绑定”。 现在你的父类将调用子类的常量。



文章来源: Overriding class constants vs properties