我想更好地理解为什么在下面的场景中,类常量被继承的方式与实例变量的区别有所不同。
<?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()方法,因此继承使用ParentClass showTest()方法。结果显示,由于该方法在ParentClass上执行,因此正在评估TEST常量的ParentClass版本,而因为它通过继承在ChildClass上下文中进行评估,所以正在评估ChildClass成员变量$ test。
我已阅读文档,但似乎没有看到任何提及这种细微差别。任何人都能为我解释一下吗?
答案 0 :(得分:161)
self::
不能识别继承并始终引用正在执行的类。如果您使用的是php5.3 +,您可以尝试static::TEST
,因为static::
是继承-知道的。
不同之处在于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
答案 1 :(得分:12)
在PHP中,self指的是定义被调用方法或属性的类。因此,在您的情况下,您在self
中调用ChildClass
,因此它使用该类中的变量。然后在self
中使用ParentClass
,这样它就会引用该类中的变量。
如果您仍希望子类覆盖父类的const
,请将父类中的以下代码调整为:
public function showTest(){
echo static::TEST;
echo $this->test;
}
请注意static
关键字。这是使用“后期静态绑定”。现在你的父类将调用你的子类的const。