karashchuk.com » Бібліотека Знань » PHP » Поймать ошибку подавленную оператором @

PHP : Поймать ошибку подавленную оператором @

Иногда в работу попадаются проекты с большим колличеством include, include_once и т.п., в общем я надеюсь понятно о чем это я. Ну пару @include еще ладно, но когда их каскад, точнее каскадище - это даже у изошренных дебаггеров вызывает ступор.

А тут привалило "счастье", поправить сайтик переехавший с одного хостинга на PHP 5.2 (он на нем родился) более шустрый, но уже на PHP 5.6.

Вы догадались о чем я ?

Именно об этом - Передача по ссылке / Passing by Reference :

В вызове функции отсутствует знак ссылки - он есть только в определении функции. Этого достаточно для корректной передачи аргументов по ссылке. Начиная с PHP 5.3.0, вы можете получить предупреждение о том, что передача переменной по ссылке устарела, если используете & в foo(&$a);. Начиная с PHP 5.4.0 передача переменной по ссылке стала невозможна, поэтому использование этого приема приведет к фатальной ошибке.

There is no reference sign on a function call - only on function definitions. Function definitions alone are enough to correctly pass the argument by reference. As of PHP 5.3.0, you will get a warning saying that "call-time pass-by-reference" is deprecated when you use & in foo(&$a);. And as of PHP 5.4.0, call-time pass-by-reference was removed, so using it will raise a fatal error.

Более детально можете прочесть по этой ссылочке - http://php.net/manual/en/language.references.pass.php

Далее обнаружил неприятную особенность у xampp сборочки - она даже в log не пишет fatal error'ы, а втыкать брейк-поинты устал.

Соорудил себе вот такой php файлик:

<?php

set_error_handler("myErrorHandler");
register_shutdown_function("myShutdownHandler");
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
  echo "<div style='font:normal 11px/15px verdana,tahoma,arial;padding:5px;color:#f00;border:1px solid #f00;margin:5px 1px;'>";
  echo "Line #<b>".$errline."</b> in file [<b>".$errfile."</b>]<br>ErrNo:[<b>".$errno."</b>] ErrStr:[<b>".$errstr."</b>]\n";
  echo "<div>";
}

function myShutdownHandler()
{
  echo "<div style='font:normal 11px/15px verdana,tahoma,arial;background:#f11;padding:10px;color:#fff;border:0px solid #fff;box-shadow:1px 1px 5px #300;margin:5px;'><xmp>";
  print_r(error_get_last());
  echo "</xmp><div>";
}

?>


И при необходимости делаю инлуд его в нужном/соответствующем месте и имею ту инфу которую скрывает от меня @ - оператор подавления ошибок/предупреждений.

Вы только посетили наш сайт, КОММЕНТИРОВАНИЕ будет доступно через несколько минут.
возможно у Вас отключен javascript, если включен - просто обновите страницу