重写类常量与属性

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

<?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。

我看过文件了,但似乎没有提到这个细微差别。有人能给我点提示吗?

43207 次浏览

In PHP, self refers to the class in which the called method or property is defined. So in your case you're calling self in ChildClass, so it uses the variable from that class. Then you use self in ParentClass, so it wil then refer to the variable in that class.

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

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

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

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