为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
UYOU 2019-11-04 14:30:08
根据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?我试图找到一个,但是没有任何运气。
查看完整描述

3 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

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


class User {

    const IS_ADMIN = 1;

    const IS_MODERATOR1 = 1 << 1; // Won't work

    const IS_MODERATOR2 = 0x02;   // works

}


查看完整回答
反对 回复 2019-11-04
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

从PHP 5.6开始,此限制不再存在

启用先前不允许的语法的新功能称为常量标量表达式:


现在可以提供涉及在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


查看完整回答
反对 回复 2019-11-04
?
暮色呼如

TA贡献1853条经验 获得超9个赞

在为此大手大笑之前,请考虑一下执行模型。在php通常用于(实际上是为php设计)的环境中,所有内容都被构建,执行,然后丢弃……直到下一个http请求进入。这没有多大意义。浪费时间在解析/编译阶段进行计算。在一般情况下,发动机需要非常快。


但是,您是对的,该手册中的引用确实说“评估”。也许您应该打开文件证明。


看来php现在将在php 5.6中支持常量标量表达式:


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 350 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信