非初始化的引用变量不会引发通知

时间:2011-07-03 13:05:34

标签: php variables pass-by-reference

我有一个函数,它将变量作为参考:

function get_articles($limit = 10, &$more = false){
  $results = get_results_from_db($limit); 
  $more = ($results->found > $limit) ? $results->found : false;
  return $results->data;
}

我使用它像:

$articles = get_articles(10, $more_results);

foreach($articles as $article){
  // do stuff
}

if($more_results) // we have more than 10 results

但我没有收到通知,告诉我上面的$more_results未定义...... 这是正常的吗?

3 个答案:

答案 0 :(得分:3)

这很正常。

仅为读取访问生成未定义的变量通知。当您通过引用传递参数时,它无异于隐含的写入访问。

 $articles = get_articles(10, $more_results);
 // $more_results = NULL;  because of & here

在函数调用之前,变量(除非存在)将被初始化为NULL,以便能够生成对该zval的引用。

如果未将变量作为第二个参数传递,则函数签名的= false默认值将仅分配给其内部参数。 (您的示例稍后会将其指定为值。)

答案 1 :(得分:1)

是的,因为$more_results始终至少定义false值(调用函数后)。
内部函数变量将不会被定义,但由于您没有读取变量的内容,因此不会生成通知。

答案 2 :(得分:1)

我在某处读到这是正常行为。如果引用的var不存在,Php将始终创建一个var。现在试着找到它,但你可以阅读下面的文章,了解为什么不在php中使用引用。

http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html