У меня есть следующий фрагмент коды:Почему в первом вызове нет ошибки E_NOTICE?
error_reporting(E_ALL | E_STRICT);
function &getVal() {
$data = [];
return $data['hey'];
//return $whatever;
}
function getVal2() {
$data = [];
return $data['hey'];
}
var_dump(getVal()); // No E_NOTICE error is issued - why?
var_dump(getVal2()); // E_NOTICE error is issued.
И вопрос: почему нет E_NOTICE
ошибки в первом вызове? Объяснение наиболее вероятно, что переменная $data['hey']
создана для возврата ссылки. Тем не менее, все же кажется неправильным не выдавать ошибку E_NOTICE, когда $data['hey']
(или $whatever
, ...
) не определен.
Вы сами ответили на вопрос. Что касается «кажется неправильным» ... это PHP, не так ли? – Jon
Ну, вы абсолютно правы. Проблема в том, что она создала его путем простого действия по его ссылке. Вероятно, это связано с тем, как ссылки обрабатываются под капотом, например, вызывая 'preg_match ('..', '..', $ match);' тоже, конечно, не будет жаловаться на '$ match' не существующее тем не менее, поскольку точка его заполняет. См. Ссылку _return by reference_ как «Я хочу, чтобы вы получили доступ к данным _ и alter_ в этом месте». То, что вы сразу же отбрасываете эту переменную после возврата, когда область действия закрывается, находится рядом с точкой. Я не говорю, что это очень красиво, но так оно и есть. – Wrikken