根据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?我试图找到一个,但没有任何运气。
答案 0 :(得分:9)
PHP不会在编译时执行此类操作;即使所有运算符都是常量,也不能将计算值分配给常量。类成员的默认值以完全相同的方式处理。我遇到了这种行为,因为我试图将两个幂分配给常量:
class User {
const IS_ADMIN = 1;
const IS_MODERATOR1 = 1 << 1; // Won't work
const IS_MODERATOR2 = 0x02; // works
}
答案 1 :(得分:7)
启用以前不允许的语法的新功能称为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
答案 2 :(得分:6)
在你为此举起手臂之前,请考虑一下执行模型。在php通常用于(实际上是为其设计)的环境中,所有内容都会被构建,执行,然后被丢弃......直到下一个http请求进入。它没有多大意义在解析/编译阶段浪费时间进行计算。在一般情况下,引擎需要非常迅速。
但是,你是对的,手册中的引用确实说“评价”。也许你应该打开一张文件票。
2014年3月编辑
看起来php现在支持php 5.6中的Constant Scalar Expressions: