猿问

使用简单表达式初始化PHP类属性声明会产生语法错误

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


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


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


public $var = array(

    1 => 4,

    2 => 5,

);

这会产生语法错误:


public $var = array(

    1 => 4,

    2 => (4+1),

);

甚至不被接受:


public $var = 4+1;

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


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


那么这是怎么回事?相对于“能够在编译时求值”的任何表达式而言,限制是否真的沿“完全不能有任何计算出的表达式”的思路进行?在文档语言中使用“求值”表示允许进行简单的计算,但是a ...


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


UYOU
浏览 351回答 3
3回答

慕盖茨4494581

PHP在编译时不执行此类操作;即使所有运算符本身都是常量,也不能将计算值分配给常量。类成员的默认值的处理方式完全相同。我在尝试将2的幂分配给常量时遇到了这种现象:class User {&nbsp; &nbsp; const IS_ADMIN = 1;&nbsp; &nbsp; const IS_MODERATOR1 = 1 << 1; // Won't work&nbsp; &nbsp; const IS_MODERATOR2 = 0x02;&nbsp; &nbsp;// works}

素胚勾勒不出你

从PHP 5.6开始,此限制不再存在启用先前不允许的语法的新功能称为常量标量表达式:现在可以提供涉及在PHP先前预期的静态值的上下文,诸如常数和属性的声明和函数默认参数的数字和字符串文字和/或常数标量表达式。class C {&nbsp; &nbsp; const THREE = TWO + 1;&nbsp; &nbsp; const ONE_THIRD = ONE / self::THREE;&nbsp; &nbsp; const SENTENCE = 'The value of THREE is '.self::THREE;&nbsp; &nbsp; public function f($a = ONE + self::THREE) {&nbsp; &nbsp; &nbsp; &nbsp; return $a;&nbsp; &nbsp; }}echo (new C)->f()."\n"; echo C::SENTENCE; ?>上面的示例将输出:4 The value of THREE is 3

暮色呼如

在为此大手大笑之前,请考虑一下执行模型。在php通常用于(实际上是为php设计)的环境中,所有内容都被构建,执行,然后丢弃……直到下一个http请求进入。这没有多大意义。浪费时间在解析/编译阶段进行计算。在一般情况下,发动机需要非常快。但是,您是对的,该手册中的引用确实说“评估”。也许您应该打开文件证明。看来php现在将在php 5.6中支持常量标量表达式:
随时随地看视频慕课网APP
我要回答