访问 PHP 类常量

2022-08-30 21:54:03

PHP手册说

与静态成员一样,不能从对象的实例访问常量值。

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

$this->inst = new Classname();
echo $this->inst::someconstant;

但是为什么这有效呢?

$this->inst = new Classname();
$inst = $this->inst;
echo $inst::someconstant;

答案 1

从 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的主干中修复了,但我不知道他们是否也修复了双冒号语法。


答案 2

如果您在类中,则可以像这样访问常量:

self::MY_CONSTANT;

例如:

class MyClass {
    const MY_CONSTANT = 'constant value';

    public function showConstant() {
        echo self::MY_CONSTANT;
    }
}

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


推荐