问:我一直认为 PHP 默认通过引用来处理数组。但是,在下面的代码片段中,情况并非如此,为这个问题和我正在编写的 RTF 解析器的一部分做好了准备。有人可以解释我为什么吗?
$stack = [];
$group = ["level" => 0, "word" => "", "groups" => []];
$stack[] = $group;
$group["word"] = "test";
$group = ["level" => 1, "word" => "", "groups" => []];
现在我希望 $stack[0]["word"] 包含值“test”,但它没有。这可能是因为我在将 $group 推入 $stack 后为其分配了另一个值吗?
答:我不知道你为什么这么想。你可能误解了两件事:
PHP 使用了一种称为“写入时复制”的优化,这基本上意味着如果两个数组相同,它们可以共享相同的内存。一旦数组不同,它们就会被分开。
PHP对象作为指针传递(与引用变量不同),因此将对象分配给新变量不会创建新对象,而是创建指向同一对象的新指针。这不适用于数组。
有关 PHP 中实际引用的解释,我建议阅读PHP 手册中的“References Explained”。
引用赋值是通过使用=&而不是=,(例如$stack[] =& $group;)来实现的,它将两个变量绑定在一起,这样无论你分配给哪个变量,都会受到影响。