【问题标题】:Overriding class constants vs properties覆盖类常量与属性
【发布时间】:2012-11-16 19:22:17
【问题描述】:

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

<?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 上执行,因此正在评估 ParentClass 版本的 TEST 常量,而因为它是通过继承在 ChildClass 上下文中评估,所以正在评估 ChildClass 成员变量 $test。

我已阅读文档,但似乎看不到任何提及此细微差别的内容。谁能帮我解释一下?

【问题讨论】:

  • WTF?不断超越!?不要这样做!从来没有!
  • @qwert_ukg 确实如此。有人应该将这一点传达给 PHP 的开发人员。或者至少允许final...
  • 肯定有足够好的用例,即使是不断覆盖:]

标签: php oop inheritance overriding constants


【解决方案1】:

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

【讨论】:

  • + 用于提及static::
  • 太棒了。感谢您的澄清并提供有关后期静态绑定的其他信息(我还没有消化)。
  • 既然test() 不是静态方法,为什么不在PHP5.3+ 中使用$this::TEST
  • 嗨@Xenos - 该示例的目的是展示在类 1 中执行的实例级代码正在从类 2 中检索静态值。 self::TEST 将返回“test1”,其中 static::TEST 返回预期的“test2” - 希望对您有所帮助,感谢您的回复!
  • 嗨@DavidFarrell - 是的,我得到了self:: / static:: 的区别,但我不明白为什么使用static:: 而不是$this::(不是self::)。 $this::static::之间有区别吗(因为static::/$this::self::之间有一个)?
【解决方案2】:

在 PHP 中,self 指的是定义了被调用方法或属性的类。因此,在您的情况下,您在ChildClass 中调用self,因此它使用该类中的变量。然后在ParentClass 中使用self,这样它就会引用该类中的变量。

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

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

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

【讨论】:

  • 亲。 static:: 在抽象而不是 self:: 中完成工作
猜你喜欢
  • 2013-04-05
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 2020-10-21
相关资源
最近更新 更多