Оператор PHP требует - Сбой, но выдает E_WARNING вместо E_COMPILE_ERROR - PullRequest
3 голосов
/ 26 января 2012

Я переместил файл в нашей системе в подпапку для организации, что, в свою очередь, нарушило относительный путь оператора require. Это должно было привести к предупреждению E_COMPILE_ERROR. Однако вместо этой ошибки наш пользовательский обработчик ошибок в приложении распознал ошибку как E_WARNING. Таким образом, наш клиентский обработчик зарегистрировал сообщение, и полученный экран PHP оказался пустым, как если бы был запущен die();. Вот журнал, созданный нашим локальным обработчиком:

E_WARNING main(XXXXXX.php): failed to open stream: No such file or directory xxx/xxx.php Line 9 01-26-2012 09:44:27 AM 01-26-2012 10:03:24 AM

Может быть важно отметить, что наша система все еще использует устаревшую PHP 4.

Любая идея, зачем требовать, чтобы бросал E_WARNING? Чтобы выяснить причину проблемы, потребовалось немного больше времени, поскольку мы не увидели ни одного сообщения об ошибке.


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


Дополнительные правки:

Может быть, структура как-то связана с этим? Вот как это работает: (-> означает включает, => означает требует)

Main-> File1.php => File2.php

Выдает ли предупреждение, потому что File1.php включен, но не обязателен? Это может иметь смысл для меня, но может показаться глюк? Мне может понадобиться проверить это на PHP 5.


РАЗРЕШЕНИЕ

Я просканировал наше приложение и нашел это:

сообщение об ошибке (E_ERROR | E_WARNING | E_PARSE);

Следовательно, E_COMPILE_ERROR не будет отображаться. Кроме того, @DaveRandom прав, когда выдает предупреждение, а затем выдает фатальную ошибку.

Изменение его на сообщение об ошибке (E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR); показывает сообщение об ошибке.

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Require выдает это предупреждение хотя бы один раз, когда вы вызываете его для файла, который не существует.Он , затем испускает E_COMPILE_ERROR и умирает.

Однако :

Следующие типы ошибок не могут быть обработаны с помощью определенного пользователемфункция: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR , E_COMPILE_WARNING и большинство E_STRICT, поднятых в файле, где set_error_handler () вызывается.боюсь, никогда не поймай ошибку.

0 голосов
/ 26 января 2012

Действительно ли это требуется? E_WARNING, кажется, подразумевает, что вы используете include вместо require там ... или, возможно, PHP4 вел себя по-другому в этом отношении? Я, честно говоря, не могу вспомнить.

...