我想更好地理解为什么在下面的场景中,类常量与实例变量的继承方式有所不同。
<?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。
我已阅读文档,但似乎看不到任何提及此细微差别的内容。谁能帮我解释一下?
最佳答案
self::
不支持继承,总是引用正在执行的类。如果您使用的是 php5.3+,您可以尝试 static::TEST
作为 static::
是继承感知的。
不同之处在于 static::
使用“后期静态绑定(bind)”。在此处查找更多信息:
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
关于php - 覆盖类常量与属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13613594/