【发布时间】:2014-05-10 16:26:08
【问题描述】:
我有一个简单的示例代码,我想在其中使用对象运算符和范围解析来获取类常量(PHP 5.5)。
<?php
class A {
const MY_CONST = 'This is my const';
}
class B {
private $property;
public function __construct(A $a) {
$this->property = $a;
echo $a::MY_CONST."<br />"; // works (1)
echo A::MY_CONST."<br />"; // works (2)
$obj = $this->property;
echo $obj::MY_CONST."<br />"; // works (3)
echo $this->property::MY_CONST; // doesn't work (4)
}
}
$b = new B(new A);
代码在 PHP 5.5.12 中测试,本题不关心与早期 PHP 版本的兼容性。
问题是 - 如果对象被设置为其他类的属性,如 (4) 中那样,并且您想将 $this 与 const 名称一起使用,是否可以访问对象 const。 1 和 2 显然有效,3 中的简单分配也有效,但多出一行。
如果不可能,是否有任何理由否认它,或者简单的 PHP 开发人员决定这样做,或者简单地忘记让它工作?对我来说,很奇怪 4 不工作,但 3 工作没有任何问题
【问题讨论】:
-
你应该首先意识到你的错误:常量被定义为class实体,而不是instance实体。即使 PHP 允许实例取消引用,如果您想引用实例“常量”,这也是逻辑错误。因此,如果 PHP 在这里有错误(显然,它有) - 那么它在事物中,它允许通过实例取消引用类常量,而不是在事物中,通过另一个类属性持有者不可能进行这种取消引用跨度>
-
也许吧,但在这个例子中,我考虑的不仅仅是逻辑,而是为什么第 3 种案例有效而第 4 种案例无效。在我看来,要么两者都应该工作,要么都不工作
标签: php class oop scope constants