重写类常量与属性

我想更好地理解为什么在下面的场景中,inheritance类常量和实例variables的方式有所不同。

<?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()方法,所以inheritance使用ParentClass的showTest()方法。 结果表明,由于该方法在ParentClass上执行,因此正在评估TEST常量的ParentClass版本,而由于它是通过inheritance在ChildClass上下文中进行评估的,因此正在评估ChildClass成员variables$ test。

我已经阅读了文档,但似乎没有看到任何提及这个细微差别。 任何人都可以为我揭开一些光明吗?

self::不是inheritance感知的,总是指它正在执行的类。如果你使用的是php5.3 +,你可以尝试static::TEST作为static::inheritance意识。

不同之处在于static::使用“后期静态绑定”。 在这里find更多信息:

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

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

 <?php class One { const TEST = "test1"; function test() { echo static::TEST; } } class Two extends One { const TEST = "test2"; } $c = new Two(); $c->test(); 

产量

 test2 

在PHP中,self是指被调用的方法或属性被定义的类。 所以在你的情况下,你在ChildClass调用self ,所以它使用该类的variables。 然后你在ParentClass使用self ,所以它会引用该类中的variables。

如果您仍然希望子类重写父类的const ,则请在您的父类中将以下代码调整为:

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

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