【问题标题】:Shoud I use trigger_error in PHP8我应该在 PHP 8 中使用 trigger_error
【发布时间】:2021-10-27 12:41:23
【问题描述】:

我正在修改一个必要的 PHP 项目,因为对数据库进行了大规模的重新设计。 因此,该项目应使用最新的 PHP 版本,在撰写本文时为 8 版。 我还在使用带有命名空间的 OOP 方法,因此该项目将来可以从自动加载等功能中受益。

在我编写的新类中,我需要抛出错误。 但是在 PHP 8 中,有很多方法可以做到这一点。 我可以使用 trigger_error 或异常或错误类及其特定变体,例如值错误。 现在我不确定该选择哪个。 目前我在代码中混合了异常和 trigger_error。

我为异常和“旧”错误定义了一个自定义处理程序,它将错误写入日志文件,以便我可以修复它们(如果可能的话)。

那么我应该使用什么来编写面向未来的代码? 不幸的是,我在 PHP 文档中找不到任何关于此的内容。 不幸的是,我的网络研究也没有带来任何有用的结果。 是否有最佳方法规则?

【问题讨论】:

    标签: error-handling php-8


    【解决方案1】:

    我不是 PHP 专家。

    但我的一点观察是,最新的 PHP 版本更倾向于 OOP。 PHP 现在支持许多OOP 功能,您可以在任何其他完全面向对象的语言(如 C# 或 Java)中找到这些功能。我们可以看到现在很多 PHP 函数都会抛出异常,并且随着 PHP 7 中 ExceptionError 以及 PHP 8 中 ValueError 的引入,您可能会遇到并且必须处理异常而不是臭名昭著的 falsenull

    现在抛出异常的 PHP 功能的一个非常小的列表(旁边有版本):

    • 内部类的构造函数现在总是会抛出异常 (PHP 7)
    • 调用参数少于强制声明的参数的函数会引发异常 (PHP 7.1)
    • 1 + "a" 抛出 TypeError (PHP 8)
    • 当分隔符参数为空时,explode 抛出 ValueError 字符串 (PHP 8)
    • 当 $string 参数为空字符串时,mb_ord 抛出 ValueError (PHP 8)
    • MySQLi 默认错误处理模式已从“静默”更改为 “例外”(PHP 8.1)

    还有更多会抛出Errorexception 的实例,而不是导致致命错误。

    结论

    抛出异常而不是使用trigger_error

    【讨论】:

    • 我也是这么想的。我发现的唯一缺点是您不能使用 OR 来引发错误/异常。例如。如果查询失败,mysqli_query 返回 false,因此我可以执行以下操作:$mysqli->query($sql) OR trigger_error('Error in '.__CLASS__.'-'.__FUNCTION__.':'.__LINE__.$mysqli->error.PHP_EOL.$sql, E_USER_ERROR); 使用错误/异常时,我必须修改此代码,使其看起来像这样:if(!mysqli->query($sql)){ throw new Error('Error in '.__CLASS__.'-'.__FUNCTION__.':'.__LINE__.$mysqli->error.PHP_EOL.$sql, E_USER_ERROR); } else{ ... }
    • php (php.net/manual/en/errorfunc.constants.php) 的文档中也有一个错误,但实际上您无法更正。我认为这是因为,开发团队正在审查它。对于每个 E_USER,他们提到这是使用 trigger_error 生成的。这不是真的,因为它也可能是错误/异常构造函数中的参数。我会at by的句子。
    • @AlexanderBehling 在 OOP 代码中,您不必使用短路评估(或)。如果您使用的是 PHP 8.1,那么只需使用 try 语句包装您的代码,然后捕获 mysqli_sql_exception。或者,如果您的 PHP 版本 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) 或 mysqli_driver::$report_mode 将您的查询错误转换为异常
    • @AlexanderBehling 至于文档,它是正确的。产生E_USER_* 错误的唯一方法是通过trigger_error()。当您将它传递给异常构造函数时,将抛出异常而不是E_ERROR
    • 似乎我不是唯一一个为此苦苦挣扎的人。见stackoverflow.com/questions/1626119/…stackoverflow.com/questions/7063053/…
    猜你喜欢
    • 2013-06-18
    • 2014-10-20
    • 2014-03-08
    • 2017-07-31
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多