php - 覆盖类常量与属性

标签 php oop inheritance overriding constants

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

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

相关文章:

php - 访问 Atlassian Jira REST API 以在过滤器上运行 super 简单的报告

php - 从字符串中删除无用的段落标签

java - switch 语句是 Java 中实现运算符解释的最快方法吗

java - 如何判断派生类的类型?

c++ - 当我在子类中具有相同名称的函数时,如何调用基类中定义的派生 const 函数?

c++ - 如何在 C++ 中对某些数据结构进行父类(super class)化?

php - 为什么 filename.php.jpg 可以作为 PHP 文件使用?

php - Sql高效快速搜索

javascript - 如何在 JavaScript 中动态创建类实例?

java - 通用类型的可比实现?