【问题标题】:Initializing PHP class property declarations with simple expressions yields syntax error使用简单表达式初始化 PHP 类属性声明会产生语法错误
【发布时间】:2011-02-11 18:30:09
【问题描述】:

根据 PHP 文档,可以在具有以下限制的类中初始化属性:

“这个声明可能包含一个初始化,但是这个初始化必须是一个常量值——也就是说,它必须能够在编译时被评估,并且不能依赖运行时信息才能被评估。”

我正在尝试初始化一个数组并遇到了一些问题。虽然这工作正常:

public $var = array(
    1 => 4,
    2 => 5,
);

这会产生语法错误:

public $var = array(
    1 => 4,
    2 => (4+1),
);

即使这样也不被接受:

public $var = 4+1;

这表明它不是 array() 语言结构的限制。

现在,我上次检查时,“4+1”等于一个常数值,不仅应该被接受,而且实际上应该被优化掉。无论如何,它当然可以在编译时进行评估。

那么这里发生了什么?限制真的是“根本不能是任​​何计算的表达式”,而不是“能够在编译时评估”的任何表达式吗?在文档的语言中使用“评估”表明允许进行简单的计算,但是唉....

如果这是 PHP 中的错误,是否有人有错误 ID?我试图找到一个,但没有任何运气。

【问题讨论】:

  • 你可以在构造函数中这样做,但不能在类变量声明中。

标签: php class syntax properties


【解决方案1】:

PHP 在编译时不做这样的操作;即使所有运算符本身都是常量,也不能将计算值分配给常量。类成员的默认值的处理方式完全相同。当我尝试将 2 的幂分配给常量时,我​​遇到了这种行为:

class User {
    const IS_ADMIN = 1;
    const IS_MODERATOR1 = 1 << 1; // Won't work
    const IS_MODERATOR2 = 0x02;   // works
}

【讨论】:

  • 最后一个是十六进制值,不是运算。
  • 我知道,只是想表明我必须回退到一个常数而不是位移位。
  • 好吧,至少我知道我没疯。尽管如果支持非常简单的表达式会很好,但只要文档清晰,我真的不介意任何一种方式。而且,他们不是。当我有机会时,我会提交一个错误。谢谢!
【解决方案2】:

在您为此向 php 伸出双手之前,请考虑一下执行模型。在 php 通常用于(实际上是设计用于)的环境中,一切都被构建、执行,然后被丢弃......直到下一个 http 请求进来。这没有多大意义在解析/编译阶段浪费时间进行计算。在一般情况下,引擎需要非常快速。

但是,您是对的,手册中的引用确实说“评估”。也许你应该开一张文件票。


2014 年 3 月编辑

看起来 php 现在将在 php 5.6 中支持 Constant Scalar Expressions

【讨论】:

    【解决方案3】:

    自 PHP 5.6 起不再存在此限制

    启用以前不允许的语法的新功能称为constant scalar expressions

    现在可以提供涉及数字的标量表达式 以及 PHP 以前的上下文中的字符串文字和/或常量 期望一个静态值,例如常量和属性声明 和默认函数参数。

    class C {
        const THREE = TWO + 1;
        const ONE_THIRD = ONE / self::THREE;
        const SENTENCE = 'The value of THREE is '.self::THREE;
    
        public function f($a = ONE + self::THREE) {
            return $a;
        }
    }
    
    echo (new C)->f()."\n"; echo C::SENTENCE; ?>
    

    上面的例子会输出:

    4 The value of THREE is 3
    

    【讨论】:

      猜你喜欢
      • 2013-05-03
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-02
      相关资源
      最近更新 更多