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

时间:2013-04-06 16:04:52

标签: php reference

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

<?php
$t = &$r["er"];
var_dump($r);
?>

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

除此之外var_dump显示:

array(1) { ["er"]=> &NULL }

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

提前致谢!

2 个答案:

答案 0 :(得分:6)

如果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;

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

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

P.S:与人们所说的相反, NOT 会抛出错误,警告或通知。回想一个没有引用的空项目 - 引用一个不存在的项目不会。巨大的差异。

答案 1 :(得分:1)

  

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

这是参考工作的方式。 $a = &$b;创建$b如果它还不存在,“以备将来参考”,如果愿意的话。它与通过引用传递的参数相同。也许这看起来很熟悉:

preg_match($pattern, $string, $matches);

这里第三个参数是一个引用参数,因此$matches在方法调用时不一定存在,但它将被创建。

  

&amp; NULL是我没想到的,我以为我会得到一个普通的NULL。

你为什么不期待它? $r['er']是“来往/来自”$t的引用。请注意,引用不是指针,$r['er']$t是对相同值的相等引用,没有方向从一个到另一个(因此在最后一句中引号)。