gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:40:44 24 4
gpt4 key购买 nike

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

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

最佳答案

这是 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'] 是一个字符串数组,可以在编译时求值,一切正常。

第二个静态变量 ($two) 使用非常量表达式 (Test::$one) 初始化。 Test::$one 是一个变量。您可以看出它的值初始值在编译时已知(请参阅上面的段落)并且可以在编译时评估表达式。

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

更新:

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

关于php - 将一个静态变量分配给另一个静态变量。为什么会抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37874166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com