为什么这段代码不会抛出未定义的属性PHP通知?

时间:2012-12-21 01:50:34

标签: php variables pass-by-reference

只是玩,我找到了。

为什么通过引用$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)
{
    // ...
}

是否与传递引用有关,因此不能直接访问属性?

3 个答案:

答案 0 :(得分:7)

是的,它发生是因为您通过引用传递它。当您通过值传递时,会尝试实际读取变量的值 - 因此会出现通知。当您通过引用传递时,不需要读取该值。

执行此操作时,如果变量/属性尚不存在,则会创建它。

来自manual

  

如果通过引用分配,传递或返回未定义的变量,它   将被创造。

<?php
function foo(&$var) { }
foo($a); // $a is "created" and assigned to null

答案 1 :(得分:5)

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未定义。

就是这样。我希望它足够清楚。

答案 2 :(得分:-2)

我在这里... ...

由于你是作为一个对象(来自一个类)访问它,它不会给你一个通知,而当你var_dump它有点像一个数组访问它(因为它是空的它会抛出一个通知)