【发布时间】:2021-09-27 15:58:01
【问题描述】:
我在这里和一般情况下进行了很多搜索,并且在发布之前已经尝试了我能想到的一切,但我无法弄清楚这一点。我敢肯定,一个体面的 php 人会立即知道问题所在,所以...
我有一个文件Db.php,其中包含abstract class Db,其中包含require_once Config.php。
Config.php 包括:
function global_exception_handler($e) {
mail(ADDR_TO, "Error", "ERROR: $e", "From: ".ADDR_FM);
}
set_exception_handler('global_exception_handler');
:: 如果我从 Config.php 中的代码下方抛出异常 - 例如,throw new Exception("Test");,它会起作用(收到电子邮件)。
:: 如果我在 Db.php 中抛出异常在 Db 类之外,它会起作用。
:: 但是如果我从 Db 类中抛出一个异常 - 例如在我执行连接测试的构造函数中 - 什么也不会发生。
即使我将 global_exception_handler 函数和 set_exception_handler 声明移动到 Db 类(使用类形式 @set_exception_handler(array($this, 'global_exception_handler'))),它也不会触发。
我知道我肯定遗漏了一些明显的东西,尽管我几乎可以肯定这在 Hostgator 将我们的服务器从 php 5.5 升级到 7.4 之前可以正常工作。
回答@WesselvanderLinden 的问题和代码请求...
-
(非常简单的)Db 类构造函数代码正在执行,并且只执行一次;我根据错误处理程序在其中添加了跟踪
mail警报以对此进行测试。 -
构造函数最初有一个
Try...Catch,我在几条内务声明之后在Catch中抛出了异常。我删除了所有的“噪音”,并将构造函数简化为简单的。 -
Config.php 文件包含在 Db.php 文件中 (
require_once),处理程序语句如上所示。
这是基本的 Db 类构造函数代码(带有注释的运行检查跟踪电子邮件):
require_once "Config.php";
abstract class Db {
public function __construct() {
//mail(ADDR_TO, "Database Error", "ERROR!", "From: ".ADDR_FM);
throw new Exception("Database connection failed");
}
}
【问题讨论】:
-
这里可能会发生一些事情。抽象类的构造函数可能会被覆盖,因此构造函数中的代码不会执行。也许某处有一个 try-catch,或者顺序错误(例如,您首先抛出异常,然后设置异常处理程序)。所以我认为你应该添加更多的代码,这样我们就可以看到发生了什么。为您的构造函数添加代码,也许还可以添加 DB 类的示例实现。否则有点难以回答:)
-
@WesselvanderLinden 我会补充这个问题,谢谢。
-
请发布一个完整的最小示例。
-
问几个问题:你为什么使用
abstract class?是否有子类扩展类Db?你如何实例化Db类? -
@wayneOS 是的,
Db类扩展为其他基于 Db 的类,例如Db_Admin、Db_Client等。所以Db本身没有被实例化。