[英]Is it possible in PHP to prevent “Fatal error: Call to undefined function”?
在 PHP 中,有什么方法可以忽略未定义的函数而不是抛出在浏览器中可见的致命错误?-即致命错误:调用未定义的函数
我知道有一种将所有自定义函数包装在如下条件中的做法,但是有没有一种编程方式来获得这种效果?
if (function_exists('my_function')) {
// use my_function() here;
}
不。致命错误是致命的。 即使您要编写自己的错误处理程序或使用@
错误抑制运算符, E_FATAL
错误仍会导致脚本停止执行。
处理这个问题的唯一方法是使用function_exists()
(并且可能是is_callable()
以进行良好的衡量),如上面的示例所示。
围绕潜在的(可能的?)错误进行防御性编码总是比让错误发生并稍后处理它更好的主意。
编辑- php7 改变了这种行为,未定义的函数/方法是可捕获的异常。
在 php 7 中,这现在是可能的。
示例代码:
try {
some_undefined_function_or_method();
} catch (\Error $ex) { // Error is the base class for all internal PHP error exceptions.
var_dump($ex);
}
http://php.net/manual/en/migration70.incompatible.php
许多致命和可恢复的致命错误已在 PHP 7 中转换为异常。这些错误异常继承自 Error 类,该类本身实现了 Throwable 接口(所有异常继承的新基接口)。
如果您想在处理对象时抑制此错误,请使用此函数:
function OM($object, $method_to_run, $param){ //Object method
if(method_exists(get_class($object), $method_to_run)){
$object->$method_to_run($param);
}
}
问候
我们可以隐藏错误,但这会登录 apache 错误日志
//设置显示错误为真。
ini_set('display_errors', "0");
//报告除通知外的所有错误
ini_set('error_reporting', E_ALL ^ E_NOTICE ^ E_STRICT);
//我们可以使用try catch方法
try {
my_method();
} catch (\Error $ex) { // Error is the base class for all internal PHP error exceptions.
var_dump($ex);
}
//检查方法是否存在
function_exists()
防止没有。 但是捕获并记录是的,使用 register_shutdown_function()
参见PHP 手册
function shutDown_handler()
{
$last_error = error_get_last();
//verify if shutwown is caused by an error
if (isset ($last_error['type']) && $last_error['type'] == E_ERROR)
{
/*
my activity for log or messaging
you can use info:
$last_error['type'], $last_error['message'],
$last_error['file'], $last_error['line']
see about on the manual PHP at error_get_last()
*/
}
}
register_shutdown_function ('shutDown_handler');
我在 PHP 7 中发现 try/catch 适用于“调用未定义函数”错误。 被捕获的异常对象不是 Throwable 类,也不是 ErrorException 而是 Error。
catch 接收到的异常对象包含错误信息、文件和行号、堆栈跟踪,但不包含严重性代码。
此捕获允许程序进行自己的日志记录或分析,并从用户可见的输出中隐藏错误消息(但会将错误记录在 PHP 错误日志中),这正是生产网站上需要的。 它还允许继续执行,这可能很危险,但您可以简单地放置“退出”; 在 catch 代码块的末尾,以防止程序继续。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.