неинициализированная ссылочная переменная не выдает уведомление - PullRequest
1 голос
/ 03 июля 2011

У меня есть функция, которая принимает переменную в качестве ссылки:

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 ]

3 голосов
/ 03 июля 2011

Это нормально.

Неопределенные уведомления о переменных создаются только для read доступов. Когда вы передаете параметр по ссылке, он равносильно неявному записи доступа.

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

Переменная (если она не существует) будет инициализирована до NULL до вызова функции, чтобы иметь возможность генерировать ссылку на этот zval.

Значение по умолчанию = false сигнатуры функции будет назначено только ее внутреннему параметру, если вы не передадите переменную в качестве второго параметра. (Ваш пример назначает его как значение позже ..)

1 голос
/ 03 июля 2011

Я где-то читал, что это нормальное поведение.Php всегда будет создавать переменную, если ссылочная переменная не существует.Пытаюсь найти его сейчас, но вы можете прочитать статью ниже, почему бы не использовать ссылки в php.

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

1 голос
/ 03 июля 2011

Да, поскольку $more_results всегда будет определяться, по крайней мере, значением false (после вызова функции).
Переменная внутри функции не будет определена, но, поскольку вы не читаете содержимое переменной, уведомлениене генерируется.

...