Подтвердить что ты не робот

Новое по ссылке, не дающее предупреждения

В Интернете [1] [2] [3], говорится, что, поскольку PHP 5.0.0 "присвоение возвращаемого значения new по ссылке" дает E_DEPRECATED или E_STRICT в зависимости от ваша версия php (E_DEPRECATED не существовала до 5.3, поэтому до этого она была E_STRICT).

Как таковое, я понимаю, что этот код должен дать такое предупреждение:

error_reporting(E_ALL | E_STRICT);

class A
{
}

$a =& new A();

Тем не менее, я пробовал это на двух совершенно разных серверах (один работает с PHP 5.3 и один работает с PHP 5.2), и ни один из них не дает никакого сообщения! Что происходит? Является ли мое понимание неправильным или что-то странное происходит на этих двух серверах?

(Мне также кажется странным, что это устарело, потому что $a = null; $b =& $a; $b = new A(); не делает то же самое, что $a = null; $b =& $a; $b =& new A();, но это только часть вопроса, если я неправильно понял то, что устарело...)

4b9b3361

Ответ 1

В ответ на ОП этот комментарий указал ему в правильном направлении:

Не удивительно, если проблема здесь в другом месте: попробуйте установить E_ALL | E_STRICT в вашем php.ini напрямую, не забудьте также изменить php-cli.ini, если вы используете этот код в командной строке.
Также дважды проверьте, не были ли ошибки скрыты делая ini_set('display_errors',1);1. Если вы используете это в окне окна, в прошлом были некоторые ошибки с этим в прошлом.

Поскольку OP также указывал, что предупреждения были сгенерированы до того, как какой-либо код был выполнен, у меня возникло подозрение, что ожидаемые предупреждения возникают во время компиляции, а не во время выполнения, поэтому я еще раз посмотрел на документы. Там я нашел эту большую заметку с красным ящиком, которая подтвердила мои подозрения:

Большинство ошибок E_STRICT оцениваются во время компиляции, поэтому такие ошибки не сообщаются в файле, где error_reporting улучшается, чтобы включать ошибки E_STRICT (и наоборот).

Поскольку версия 5 PHP - это "скомпилированный" язык (похож на Java, код компилируется в Zend Bytecode). Когда Zend-engine компилирует код с ошибками, выпущенными во время компиляции, вызов script error_reporting не влияет на погоду или не сообщается об этих ошибках: вызов error_reporting применяется только к ошибкам времени выполнения/предупреждения.
Возможно, это: error_reporting(E_ALL | E_STRICT | E_COMPILE_ERROR); тоже стоит посмотреть

Итог:
Установите отчет об ошибках в файлах php.ini, когда сможете.