В моей текущей конфигурации всякий раз, когда какой-либо файл PHP содержит фатальные ошибки, такие как синтаксические ошибки или вызов несуществующей функции, я обычно получаю сообщение об ошибке, например:
Parse error: syntax error, unexpected <whatever> in /path/to/file.php on line XXX
or
Fatal error: Call to undefined function whatever() in /path/to/file.php on line YYY
или подобное в самом выводе.
Однако я использую сторонние библиотеки, которые используют сторонний автозагрузчик. Всякий раз, когда возникает фатальная ошибка в любом из автоматически загружаемых классов (включая ошибки синтаксического анализа или вызов несуществующих функций — на самом деле не совсем уверен в последнем, но определенно в случае ошибки синтаксического анализа), я просто получаю пустую страницу, и не только это: никакая ошибка не регистрируется даже в файле error_log Apache, где обычно регистрируются фатальные ошибки PHP. Таким образом, отладка становится невозможной.
Я не могу не подчеркнуть этого: это происходит только, когда фатальная ошибка возникает в каком-то автоматически загружаемом файле. В любом другом случае (включая, конечно, ошибки в файлах, включенных через require()
, include()
и т.п.) одни и те же ошибки отображаются в выводе и в error_log.
Я не писал код автозагрузчика, но в основном он такой:
// no idea why this line, but I don't think it's relevant:
ini_set('unserialize_callback_func', 'spl_autoload_call');
spl_autoload_register(array('My_Autoloader', 'autoload'), true);
class My_Autoloader {
static function autoload($classname) {
$filename = //.... computes $filename from $classname
require_once($filename);
}
}
Должен быть способ заставить автозагрузчик выдавать ошибки так же, как они выдавались бы (и обрабатывались), если бы ошибки не были в автозагружаемом файле, верно?
Как мне это получить?
Fatal error: Call to undefined function whatever()
не имеет ничего общего с синтаксическими ошибками. - person JustOnUnderMillions   schedule 14.10.2016find -type f -exec php -l {} \; > /dev/null
- person bishop   schedule 15.10.2016