use*_*929 6 php syntax properties class
根据PHP文档,可以使用以下限制初始化类中的属性:
"这个声明可能包括一个初始化,但是这个初始化必须是一个常量值 - 也就是说,它必须能够在编译时进行评估,并且不能依赖于运行时信息才能被评估."
我正在尝试初始化一个数组并遇到一些问题.虽然这很好:
public $var = array(
1 => 4,
2 => 5,
);
Run Code Online (Sandbox Code Playgroud)
这会产生语法错误:
public $var = array(
1 => 4,
2 => (4+1),
);
Run Code Online (Sandbox Code Playgroud)
即使这不被接受:
public $var = 4+1;
Run Code Online (Sandbox Code Playgroud)
这表明它不是array()语言结构的限制.
现在,我最后一次检查时,"4 + 1"等同于一个恒定值,不仅应该被接受,而且实际上应该被优化掉.无论如何,它肯定能够在编译时进行评估.
那么这里发生了什么?限制是否真的沿着"根本不能是任何计算表达式",而不是任何"能够在编译时评估"的表达式?在doc的语言中使用"evaluate"表明允许进行简单的计算,但是......
如果这是PHP中的错误,是否有人有错误ID?我试图找到一个,但没有任何运气.
PHP不会在编译时执行此类操作; 即使所有运算符都是常量,也不能将计算值分配给常量.类成员的默认值以完全相同的方式处理.我遇到了这种行为,因为我试图将两个幂分配给常量:
class User {
const IS_ADMIN = 1;
const IS_MODERATOR1 = 1 << 1; // Won't work
const IS_MODERATOR2 = 0x02; // works
}
Run Code Online (Sandbox Code Playgroud)
启用以前不允许的语法的新功能称为常量标量表达式:
现在可以在上下文中提供涉及数字和字符串文字和/或常量的标量表达式,其中PHP以前期望静态值,例如常量和属性声明以及默认函数参数.
Run Code Online (Sandbox Code Playgroud)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; ?>上面的例子将输出:
Run Code Online (Sandbox Code Playgroud)4 The value of THREE is 3