Когда ты есть отчет об ошибках, вы не можете уйти просто с проверкой логического результата. Если сообщение не выдано, предупреждения выдаются (т. Е. «Предупреждение: без конечного разделителя xxx найдено».)
То, что я нахожу странным, заключается в том, что документация PHP ничего не сообщает об этих брошенных предупреждениях.
Ниже приведено мое решение этой проблемы, используя try, catch.
//Enable all errors to be reported. E_WARNING is what we must catch, but I like to have all errors reported, always.
error_reporting(E_ALL);
ini_set('display_errors', 1);
//My error handler for handling exceptions.
set_error_handler(function($severity, $message, $file, $line)
{
if(!(error_reporting() & $severity))
{
return;
}
throw new ErrorException($message, $severity, $severity, $file, $line);
});
//Very long function name for example purpose.
function checkRegexOkWithoutNoticesOrExceptions($test)
{
try
{
preg_match($test, '');
return true;
}
catch(Exception $e)
{
return false;
}
}
Просто чтобы подчеркнуть, это строго ('===') Boolean 'false', а не значение фальши (' == '), такое как' 0'. – Wiseguy
Это похоже работа. Я предположил, что preg_ * вернет false, если это не соответствует выражению, тем самым давая ложные срабатывания. – CrazeD
@CrazeD В зависимости от вызываемой функции и передаваемой опции может быть множество значений. Для выше, если '$ subject' не соответствует' $ pattern', и был действителен, он вернет '0'. Однако 'preg_replace' вернет' NULL' при ошибке вместо false. Вам просто нужно взглянуть на документы для конкретной функции, которую вы используете. – cspray