【问题标题】:Why php does not complain when referencing a non existing variable?为什么 php 在引用不存在的变量时不抱怨?
【发布时间】:2013-03-28 23:50:11
【问题描述】:

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

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

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

除了var_dump 显示这个:

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

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

提前致谢!

【问题讨论】:

  • 引用未声明的变量会自动在该范围内定义其名称。
  • @MarkBaker:错了。查看我的答案和/或运行代码来说服自己。 & 使一切变得不同。

标签: php reference


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • +1 先生,这是一个很好的答案!尤其是当你提到“preg_match”和“没有方向”时,这些关于方向的信息是我所缺少的,它已经帮助我深入理解事物。不幸的是我可以接受一个答案,我不可能选择两个答案都超过接受,我不得不做 echo rand(1,2);为了选择,希望我不会因此受到惩罚!非常感谢!那个“方向”的东西太好学了!
【解决方案2】:

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

<?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:与人们所说的相反,这不会引发错误、警告或通知。在没有引用的情况下调用一个空项目 - 引用一个不存在的项目不会。很大很大差别。

【讨论】:

  • 好答案! +1。我还没认出&amp; 运算符
  • 您在那里放了一段非常令人印象深刻的代码,因为 $i
猜你喜欢
  • 2017-01-17
  • 2020-11-30
  • 2016-10-30
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 2021-04-14
  • 2012-12-05
相关资源
最近更新 更多