我有简单的示例代码,我希望将对象运算符与作用域分辨率一起使用以获得类常量(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 name一起使用,则是否可以访问对象const。 1和2显然是有效的,3中的简单分配也可以工作但是可以增加一条线。
如果不可能有任何理由否认它或简单的PHP开发人员决定如此或简单忘记使其正常工作?对我来说很奇怪,4不工作,但3工作没有任何问题
答案 0 :(得分:1)
你的问题的答案是:是的,这是可能的。但是以三种方式之一:
$tmp = $this->property;
return $tmp::MY_CONST;
或者,IMO,位更直观:
$class = get_class($this->property);
return $class::MY_CONST;
另一种方法是:
$r = new RefletionClass($this->property);
return $r->getConstant('MY_CONSTANT');
至于您的代码生成解析器错误的原因,我并非100%肯定。但是,我可以告诉你,PHP语法非常复杂,而且有点混乱
但是,我不会惊讶地发现,$this->foo::BAR
是一个表达式,它解析了解析器错误。