7

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

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

不会对不存在的变量发出警告。

除此之外,还var_dump展示了这个:

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

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

提前致谢!

4

2 回答 2

8

如果 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 等上这样做,创建空项目以引用它们。

PS:与人们所说的相反,这不会引发错误、警告或通知。在没有引用的情况下调用一个空项目 - 引用一个不存在的项目不会。很大很大很大不同。

于 2013-04-06T16:13:24.100 回答
3

不会对不存在的变量发出警告。

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

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

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

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

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

于 2013-04-06T16:46:39.323 回答