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)
它是否与通过引用传递有关,因此不直接访问属性?
是的,它发生是因为您通过引用传递它.当您通过值传递时,会尝试实际读取变量的值 - 因此会出现通知.通过引用传递时,不需要读取该值.
执行此操作时,如果变量/属性尚不存在,则会创建该属性.
从手册:
如果通过引用分配,传递或返回未定义的变量,它将被创建.
Run Code Online (Sandbox Code Playgroud)<?php function foo(&$var) { } foo($a); // $a is "created" and assigned to null
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没有定义.
就这样.我希望它足够清楚.