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

gre*_*emo 7 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)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

kap*_*apa 7

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

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

手册:

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

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


hak*_*kre 5

newAxis(&$current)
Run Code Online (Sandbox Code Playgroud)

是通过引用传递.这意味着你传递一个变量.

默认情况下,PHP中的所有变量都是未定义的.

你可以通过使用,例如,定义它们

$a = 1;
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,PHP并没有抱怨这$a是未定义的,对吧?

好的;),见这里:

$a = $b;
Run Code Online (Sandbox Code Playgroud)

PHP现在抱怨$b未定义.

$a(您定义变量)和$b(未定义变量)一样,它通过引用或值传递:

$this->newAxis($a);
Run Code Online (Sandbox Code Playgroud)

$a通过引用传递时定义变量.它带有默认值NULL.现在这个$b例子:

var_dump($b);
Run Code Online (Sandbox Code Playgroud)

var_dump按值获取参数.因此PHP抱怨$b没有定义.

就这样.我希望它足够清楚.