【问题标题】:Accessing PHP Class Constants访问 PHP 类常量
【发布时间】:2011-03-27 06:02:11
【问题描述】:

PHP 手册说

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

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

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

但那为什么会这样呢?

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

【问题讨论】:

  • $inst::someconstant 是有效的语法,但它真的有效吗?

标签: php oop


【解决方案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!

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

【讨论】:

  • 所以这真的可能归结为 php 解析器中的一个错误,将在以后的版本中修复?
  • 这是一个疏忽或故意的决定。我不确定我会称之为错误。 PHP 内部人员倾向于认为人们很容易混淆,所以他们尽量不让可能“模棱两可”的语法通过。双冒号也用于指代静态方法;在类的实例上调用静态方法是完全没有意义的。也就是说,如果他们要限制 that 行为,那将是运行时错误,而不是 parse 错误。
  • 是的,十年过去了,没有人应该再使用 PHP 5,但这里有一个基于此示例的 3v4l,表明问题已在 PHP 7+ 中得到修复:3v4l.org/4Vj1N
【解决方案2】:

引用手册:

从 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 在某些方面很有趣。

【讨论】:

    【解决方案3】:

    如果你在班级里,你可以像这样访问常量:

    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

    【讨论】:

    • 完全偏离主题
    • @woens 主题是“访问 PHP 类常量”,这个答案是关于访问 PHP 类常量的。
    【解决方案4】:

    php 支持从对象实例访问类常量。下面的代码正在运行(在 phpv5.5.5 中检查)

    <?php
    class superheroes{
        const kal_el = 'Superman';
    }
    
    $instance = new superheroes;
    echo $instance::kal_el;
    

    来源:http://dwellupper.io/post/48/defining-class-constants-in-php

    【讨论】:

      猜你喜欢
      • 2014-02-09
      • 2018-06-25
      • 2021-07-18
      • 2011-09-19
      • 1970-01-01
      • 2012-07-27
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多