我想知道为什么当我们引用一个不存在的变量(它是一个普通变量或数组)时 php 不抱怨,这就是它的方式,还是我还缺少其他东西?例如这段代码
<?php
$t = &$r["er"];
var_dump($r);
?>
不会对不存在的变量发出警告。
除此之外,还var_dump
展示了这个:
array(1) { ["er"]=> &NULL }
这&NULL
是我没想到的,我以为我会得到一个普通的NULL
.
提前致谢!
如果 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:与人们所说的相反,这不会引发错误、警告或通知。在没有引用的情况下调用一个空项目 - 引用一个不存在的项目不会。很大很大很大不同。
不会对不存在的变量发出警告。
这就是引用的工作方式。 如果它尚不存在,则$a = &$b;
创建,“供将来参考”,如果你愿意的话。$b
这与通过引用传递的参数相同。也许这对你来说很熟悉:
preg_match($pattern, $string, $matches);
这里第三个参数是引用参数,因此$matches
在方法调用时不必存在,但会被创建。
&NULL 是我没想到的,我以为我会得到一个普通的 NULL。
为什么没想到?$r['er']
是“to/from”的引用$t
。请注意,引用不是指针,$r['er']
而是$t
对相同值的相等引用,从一个到另一个没有方向(因此最后一句中的引号)。