为啥这段代码没有抛出未定义的属性 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”

Laravel 属于抛出未定义的错误