php – 将静态变量分配给另一个静态变量.为什么会抛出错误?

Class Test {
   private static $one = ['a','b'];
   private static $two = Test::$one; // Throws an error
   // Error : syntax error, unexpected '$one', expecting 'identifier' or 'class'
}

为什么它会抛出一个错误,这是什么方法让$2 = $1?

最佳答案
这是PHP编译器的限制,它在documentation中进行了解释:

Like any other PHP static variable, static properties may only be initialized using a literal or constant before PHP 5.6; expressions are not allowed. In PHP 5.6 and later, the same rules apply as const expressions: some limited expressions are possible, provided they can be evaluated at compile time.

这里的关键声明是:“只要它们可以在编译时进行评估”.

从您收到的错误消息我可以告诉您正在使用PHP 5.在PHP 7上,错误消息被重新编写以清楚地说明问题.它说“常量表达式包含无效操作”.

第一个静态变量($one)的声明编译,因为您使用常量表达式初始化它. [‘a’,’b’]是一个字符串数组,可以在编译时进行评估,一切都很好.

第二个静态变量($2)使用非常量表达式(Test :: $one)初始化. Test :: $one是一个变量.您可以告诉它的值初始值在编译时是已知的(参见上面的段落),并且可以在编译时评估表达式.

这种行为需要在编译时对代码进行更深入的分析.它可能在C或Java编译器中实现,但这些语言只编译一次,它们生成的代码存储在文件中,稍后执行或解释.由于某种原因,PHP编译器无法以这种方式工作.它在每次执行之前编译脚本,这就是为什么它旨在尽可能快地完成编译,并且不会在代码分析和优化方面投入太多精力.

更新:

正如@deceze在comment中指定的那样,表达式Test :: $one无法在$2的声明中进行求值,因为它使用的是此时尚未完全定义的类Test.甚至允许这种引用的其他语言的编译器也无法在达到$2的声明时计算Test :: $one的值.他们需要使用第二个编译传递来评估它.

转载注明原文:php – 将静态变量分配给另一个静态变量.为什么会抛出错误? - 代码日志