Есть ли способ, которым я могу сказать PHP выдать исключение, когда я пытаюсь получить доступ к члену или методу на null
объект?
Например.:
$x = null;
$x->foo = 5; // Null field access
$x->bar(); // Null method call
Прямо сейчас я получаю только следующие ошибки, которые не очень хорошо обрабатываются:
PHP Notice: Trying to get property of non-object in ...
PHP Warning: Creating default object from empty value in ...
PHP Fatal error: Call to undefined method stdClass::bar() in ...
Я хотел бы, чтобы вместо этого было выброшено конкретное исключение. Это возможно?
Вы можете превратить ваши предупреждения в исключения, используя set_error_handler () поэтому, когда появляется предупреждение, оно генерирует исключение, которое вы можете перехватить в блоке try-catch.
Неустранимые ошибки не могут быть превращены в исключения, они предназначены для php, чтобы остановить как можно скорее. однако мы можем изящно обработать ошибку плода, выполнив некоторую последнюю обработку, используя register_shutdown_function ()
<?php
//Gracefully handle fatal errors
register_shutdown_function(function(){
$error = error_get_last();
if( $error !== NULL) {
echo 'Fatel Error';
}
});
//Turn errors into exceptions
set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});
try{
$x = null;
$x->foo = 5; // Null field access
$x->bar(); // Null method call
}catch(Exception $ex){
echo "Caught exception";
}
Добавьте этот код в файл, который включен или выполняется перед чем-либо еще:
set_error_handler(
function($errno, $errstr, $errfile, $errline) {
throw new \ErrorException($errstr, $errno, 1, $errfile, $errline);
}
);
Попробуйте этот код, чтобы перехватить все ошибки:
<?php
$_caughtError = false;
register_shutdown_function(
// handle fatal errors
function() {
global $_caughtError;
$error = error_get_last();
if( !$_caughtError && $error ) {
throw new \ErrorException($error['message'],
$error['type'],
2,
$error['file'],
$error['line']);
}
}
);
set_error_handler(
function($errno, $errstr, $errfile, $errline) {
global $_caughtError;
$_caughtError = true;
throw new \ErrorException($errstr, $errno, 1, $errfile, $errline);
}
);
Это должно быть выполнено или включено перед другим кодом.
Вы также можете реализовать Singleton, чтобы избежать глобальных переменных или позволить ему генерировать два исключения, если вы не возражаете.
Правильный ответ должен быть: НЕТ. Это невозможно в любой версии PHP.