Php 将一个静态变量分配给另一个静态变量。为什么它会抛出错误?

Php 将一个静态变量分配给另一个静态变量。为什么它会抛出错误?,php,class,oop,object,static,Php,Class,Oop,Object,Static,它为什么会抛出错误,以及如何使$two=$one?这是PHP编译器的一个限制,下面将对此进行说明: 与任何其他PHP静态变量一样,静态属性只能在PHP5.6之前使用文本或常量初始化;不允许使用表达式。在PHP5.6和更高版本中,相同的规则适用于常量表达式:一些有限的表达式是可能的,只要它们可以在编译时进行计算 这里的关键语句是:“只要可以在编译时对它们进行评估” 从您收到的错误消息中,我可以告诉您正在使用PHP5。在PHP7上,错误消息被重新编写以清楚地说明问题。它表示“常量表达式包含无效操作”

它为什么会抛出错误,以及如何使
$two
=
$one

这是PHP编译器的一个限制,下面将对此进行说明:

与任何其他PHP静态变量一样,静态属性只能在PHP5.6之前使用文本或常量初始化;不允许使用表达式。在PHP5.6和更高版本中,相同的规则适用于常量表达式:一些有限的表达式是可能的,只要它们可以在编译时进行计算

这里的关键语句是:“只要可以在编译时对它们进行评估”

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

第一个静态变量(
$one
)的声明是编译的,因为您使用常量表达式初始化它<代码>['a','b']是一个字符串数组,可以在编译时对其进行计算,一切正常

第二个静态变量(
$two
)用非常量表达式(
测试::$one
)初始化<代码>测试::$one是一个变量。可以看出它的值初始值在编译时是已知的(参见上面的段落),表达式可以在编译时进行计算

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

更新:


正如@deceze在a中所指定的那样,表达式
Test::$one
不能在
$two
的声明中计算,因为它使用的类
Test
,此时还没有完全定义。即使是允许这种引用的其他语言的编译器,当它们达到
$two
的声明时,也无法计算
Test::$one
的值。他们需要使用第二个编译过程才能对其进行评估。

甚至在此之外,
Test::$one此时根本不可用,因为对
Test
类定义的解析尚未完成。
Class Test {
   private static $one = ['a','b'];
   private static $two = Test::$one; // Throws an error
   // Error : syntax error, unexpected '$one', expecting 'identifier' or 'class'
}