2013-12-17 3 views
8

У меня есть следующий фрагмент коды:Почему в первом вызове нет ошибки 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, ...) не определен.

+0

Вы сами ответили на вопрос. Что касается «кажется неправильным» ... это PHP, не так ли? – Jon

+1

Ну, вы абсолютно правы. Проблема в том, что она создала его путем простого действия по его ссылке. Вероятно, это связано с тем, как ссылки обрабатываются под капотом, например, вызывая 'preg_match ('..', '..', $ match);' тоже, конечно, не будет жаловаться на '$ match' не существующее тем не менее, поскольку точка его заполняет. См. Ссылку _return by reference_ как «Я хочу, чтобы вы получили доступ к данным _ и alter_ в этом месте». То, что вы сразу же отбрасываете эту переменную после возврата, когда область действия закрывается, находится рядом с точкой. Я не говорю, что это очень красиво, но так оно и есть. – Wrikken

ответ

0

Я думаю, что это связано со ссылкой и ее недостатками в PHP.

Когда вы ссылаетесь в PHP, создается привязка. Настраивание объектов PHP не является строгим, а php не знает, на какой объект ссылается, что интерпретатор предполагает, что в объекте может существовать ['hey'].

PHP не хватает позднего связывания и строгой типизации. Вот почему такие «странные» вещи иногда происходят.

-3

Используйте только error_reporting(1) в верхней части файла PHP ...

+0

Это очень краткий ответ. Больше объяснений было бы полезно. –

1

Это ожидаемое поведение

http://www.php.net/manual/en/language.references.whatdo.php#language.references.whatdo.assign

Если вы назначаете, передать или вернуть неопределенную переменную по ссылке, это будет .

И некоторые связанные с «ошибки»:

https://bugs.php.net/bug.php?id=30350

Хорошо, оказывается, что создается элемент, потому что мы пытаемся вернуть ссылку на то, что не существует.

https://bugs.php.net/bug.php?id=27627

При попытке получить доступ к несуществующему элементу массива вы эффективно его создание, поэтому NULL записей в массиве.

Смежные вопросы