为啥这段代码没有抛出未定义的属性 PHP 通知?
Posted
技术标签:
【中文标题】为啥这段代码没有抛出未定义的属性 PHP 通知?【英文标题】:Why this code is NOT throwing an undefined property PHP notice?为什么这段代码没有抛出未定义的属性 PHP 通知? 【发布时间】:2012-12-08 15:01:57 【问题描述】:只是在玩,我发现了这个。
为什么引用 $this->newAxis()
的调用不抛出未定义的属性通知(xAxis
属性),而 var_dump()
却抛出?
public function newXAxis()
// var_dump(isset($this->xAxis)); // false
// var_dump($this->xAxis); // Throws the notice
return $this->newAxis($this->xAxis); // Should throw the notice?!
protected function newAxis(&$current)
// ...
是否与通过引用传递有关,因此不直接访问该属性?
【问题讨论】:
【参考方案1】:是的,它发生是因为您通过引用传递它。当您按值传递时,会尝试实际读取变量的值 - 因此会出现一条通知。通过引用传递时,不需要读取值。
执行此操作时,如果变量/属性尚不存在,则会创建它。
来自manual:
如果您通过引用分配、传递或返回未定义的变量,它 将被创建。
<?php function foo(&$var) foo($a); // $a is "created" and assigned to null
【讨论】:
我喜欢编程,因为你总能学到新东西。感谢您对手册的参考。【参考方案2】:newAxis(&$current)
是通过引用传递的。这意味着您正在传递一个变量。
默认情况下,PHP 中的所有变量都是未定义的。
您只需使用来定义它们,例如
$a = 1;
如您所见,PHP 不会在这里抱怨 $a
未定义,对吧?
好的;),请看这里:
$a = $b;
PHP 现在抱怨 $b
未定义。
与$a
(您定义变量)和$b
(未定义变量)一样,它是通过引用或值传递:
$this->newAxis($a);
变量$a
是在引用传递时定义的。它带有默认值NULL
。现在是$b
示例:
var_dump($b);
var_dump
按值获取参数。因此 PHP 抱怨 $b
没有定义。
仅此而已。我希望它足够清楚。
【讨论】:
【参考方案3】:我在这里要走弯路了……
由于您将它作为一个对象(从一个类)访问,它不会给您通知,而当您 var_dump 某些东西时,它会像一个数组一样访问它(并且由于它是空的,它会抛出一个通知)
【讨论】:
以上是关于为啥这段代码没有抛出未定义的属性 PHP 通知?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Python 会在 Pygame 中为“事件”变量抛出未绑定的本地错误? [关闭]
致命错误:第 19 行的 C:\xampp\htdocs\register.php 中抛出未捕获的异常“PDOException”