访问PHP类常量

pet*_*azz 15 php oop

PHP手册说

与静态成员一样,无法从对象的实例访问常量值.

这解释了为什么你不能这样做

$this->inst = new Classname();
echo $this->inst::someconstant;
Run Code Online (Sandbox Code Playgroud)

但那么为什么这样呢?

$this->inst = new Classname();
$inst = $this->inst;
echo $inst::someconstant;
Run Code Online (Sandbox Code Playgroud)

Cha*_*les 19

从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
Run Code Online (Sandbox Code Playgroud)

前一种语法失败的原因是PHP解析器在属性引用之后不知道如何解析双冒号.这是否是故意的是未知的.

后一种语法有效,因为它不直接通过属性,而是通过一个局部变量,解析器接受它作为可以使用的东西:

php > $inst = $b->foo;
php > echo $inst::A;
a!
Run Code Online (Sandbox Code Playgroud)

(顺便提一下,对于匿名函数作为属性也有同样的限制.你不能直接使用parens调用它们,你必须先将它们分配给另一个变量,然后从那里调用它们.这已在PHP的主干中修复,但是我不知道他们是否也修复了双冒号语法.)


Mat*_*hew 8

引用手册:

从PHP 5.3.0开始,可以使用变量引用该类.变量的值不能是关键字(例如self,parent和static).

它继续使用这个例子:

$class = new MyClass();
echo $class::constant."\n"; // As of PHP 5.3.0
Run Code Online (Sandbox Code Playgroud)

所以$inst::someconstant应该工作.

至于为什么$this->inst::someconstant给出解析错误,我不知道.PHP对某些事情很有趣.


And*_*rew 6

如果你在课堂上,你可以像这样访问常量:

self::MY_CONSTANT;
Run Code Online (Sandbox Code Playgroud)

例如:

class MyClass {
    const MY_CONSTANT = 'constant value';

    public function showConstant() {
        echo self::MY_CONSTANT;
    }
}
Run Code Online (Sandbox Code Playgroud)

http://php.net/manual/en/language.oop5.constants.php

  • 您应该使用 static 而不是 self,因为使用 self 关键字可能会产生不需要的副作用。请参阅/sf/ask/819706961/ Between-selfbar-and-staticbar-in-php (2认同)