我刚刚注意到我的php代码中存在以下行为,我想知道它为什么会发生。
$array = array();
test_value($array['invalid_index']); // Error -> Notice: Undefined index: invalid_index in ...
test_reference($array['invalid_index']); //No error
function test_value($value){}
function test_reference(&$value){}
我期望test_value
和test_reference
都抛出未定义的索引错误,但奇怪的是,引用方法不会引发任何错误。
为什么?
答案 0 :(得分:5)
函数参数by-reference接受先前未声明的变量;通过传递它们作为参考来宣布它们。如果你看一下by-reference参数的典型用例,这就完全合情合理了:
$foo = preg_match('/(.)/', 'bar', $baz);
此函数返回一个值,该值将分配给$foo
。但是,此函数还应返回匹配项,这是第三个参数$baz
。由于函数一次只能return
一个值,因此通过填充引用传递的变量来实现额外的“返回”值。
如果必须预先初始化这些变量,您的代码将如下所示:
$baz = null;
$foo = preg_match('/(.)/', 'bar', $baz);
echo $baz[0];
这使得代码比必要的更复杂;因此,PHP不要求事先“存在”这些变量。