PHP手册说
与静态成员一样,无法从对象的实例访问常量值。
解释了为什么你不能这样做
$this->inst = new Classname();
echo $this->inst::someconstant;
但是为什么这会起作用?
$this->inst = new Classname();
$inst = $this->inst;
echo $inst::someconstant;
答案 0 :(得分:18)
从PHP交互式shell:
php > class Foo { const A = 'a!'; }
php > class Bar { public $foo; }
php > $f = new Foo;
php > $b = new Bar;
php > $b->foo = $f;
php > echo $b->foo::A;
PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM, expecting ',' or ';' in php shell code on line 1
前一种语法失败的原因是PHP解析器在属性引用之后不知道如何解析双冒号。这是否故意是未知的。
后一种语法有效,因为它不直接通过属性,而是通过一个局部变量,解析器可以接受它作为它可以使用的东西:
php > $inst = $b->foo;
php > echo $inst::A;
a!
(顺便说一下,匿名函数作为属性也有同样的限制。你不能直接使用parens调用它们,你必须先将它们分配给另一个变量,然后从那里调用它们。这已经在PHP中修复了trunk,但我不知道他们是否也修复了双冒号语法。)
答案 1 :(得分:8)
引用手册:
从PHP 5.3.0开始,可以使用变量引用该类。变量的值不能是关键字(例如self,parent和static)。
继续使用这个例子:
$class = new MyClass();
echo $class::constant."\n"; // As of PHP 5.3.0
所以$inst::someconstant
应该有效。
至于$this->inst::someconstant
给出解析错误的原因,我不知道。 PHP对某些事情很有趣。
答案 2 :(得分:6)
如果你在课堂上,你可以像这样访问常量:
self::MY_CONSTANT;
例如:
class MyClass {
const MY_CONSTANT = 'constant value';
public function showConstant() {
echo self::MY_CONSTANT;
}
}
答案 3 :(得分:0)
php支持从对象实例访问类常量。下面的代码正在运行(在phpv5.5.5中检查):
X_var = Modifiable84.Value
来源:http://dwellupper.io/post/48/defining-class-constants-in-php