为什么php在引用非现有变量时不会抱怨?

Mel*_*lsi 6 php reference

我想知道为什么当我们引用一个非现有变量(它是一个普通的变量或数组)时,php不会抱怨,这是否就是这样,或者我还缺少其他东西?例如这段代码

<?php
$t = &$r["er"];
var_dump($r);
?>
Run Code Online (Sandbox Code Playgroud)

不会抛出有关非现有变量的警告.

除了var_dump表明这个:

array(1) { ["er"]=> &NULL }
Run Code Online (Sandbox Code Playgroud)

&NULL是我没想到的,我想我会得到一个简单的NULL.

提前致谢!

Séb*_*uld 7

如果PHP解释器引用var的内存对我有用,PHP将在哈希表中创建一个null元素,其中包含一个类似您发送的键并引用它.通过运行以下测试可以看到这一点:

<?php
$i = 0;
$arr = [];
$arrS = null;
$v = memory_get_peak_usage();
for ($i = 0; $i < 150; $i++) {
    $arrS = &$arr[rand()];
}
$v = memory_get_peak_usage() - $v;
echo $v;
Run Code Online (Sandbox Code Playgroud)

在默认堆大小之前,PHP将返回一个额外的0内存 - 因为它仍然分配已经"准备好"的数组项(PHP保留一些额外的哈希表元素为空但为性能目的而分配).您可以通过将其设置为0到16(这是堆大小!)来查看.

当你超过16时,PHP将不得不分配额外的项目,并且将在i = 17,i = 18等上执行此操作...,创建空项目以便引用它们.

PS:相反的是人说,这确实不是抛出一个错误,警告或通知.回想一个没有引用的空项目 - 引用一个不存在的项目不会.巨大的差异.