未初始化的引用变量没有抛出通知


non-initialized referenced variable doesn't throw notice

我有一个函数,它接受一个变量作为引用:

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是未定义的…这正常吗?

正常

未定义变量通知仅在read访问时生成。然而,当你通过引用传递一个形参时,它相当于一个隐式的访问。

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

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

如果不传递变量作为第二个参数,函数签名的= false默认值只会分配给它的内部参数。(您的示例稍后将其作为值赋值…)

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

我在某处读到这是正常的行为。如果引用的变量不存在,Php总是会创建一个变量。试图找到它现在,但你可以阅读下面的文章为什么不在php中使用引用。

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