我正在尝试构建一个子Exception类(ovi_Exception
),并且遇到了__construct()的问题。我希望能够在子Exception类中访问我的MySQL类,通常我会通过以下方式执行此操作:
require_once( 'lib/Exception.php' );
$Process = new ovi_Exception( $MySQL );
$MySQL
是MySQL类的一个实例。然后,异常类看起来像:
class ovi_Exception extends Exception {
private $MySQL = NULL;
public function __construct( $MySQL ) {
$this->MySQL = $MySQL;
}
意思是我现在可以访问MySQL类$this->MySQL->method()
。但是我知道要保持Exception类正常工作,我需要修改__construct()
,如下所示:
public function __construct( $MySQL ) {
$this->MySQL = $MySQL;
parent::__construct( $message, $code = 0 );
}
但是现在我得到了未定义的变量通知,我不能再从异常中检索getMessage()
,这是我想要构建这个子类的关键。
parent::__construct( $message = NULL, $code = 0 );
删除了通知,但我仍然没有从getMessage()
获得任何内容。我真的不明白这对父__construct()
的调用是什么。
如何在这个子Exception类中维护对另一个类的访问并保持Exception类正常运行?我在其他课程中访问其他课程的方式是否存在根本缺陷?我以前从来没有遇到过这样的问题,但对OOP来说还是比较新的。
感谢。
答案 0 :(得分:3)
这种行为很正常。您正在创建一个扩展Exception
类的新类,但您没有传递正确的变量。
如果您打开原始Exception
课程,则会看到
class Exception {
....
public function __construct($message = "", $code = 0, Exception $previous = null) {}
....
}
如您所见,Exception
类在其构造函数中接收了几个参数($message,$code,$previous
)。在扩展ovi_Exception
类的Exception
中,您只有数据库链接变量$MySQL
。然后,您正在初始化父类Exception
,并且您正在传递空/未定义变量$message, $code = 0
。因此,当您尝试ovi_Exception->getMessage()
时,您收到无错误消息是很正常的。
答案 1 :(得分:3)
为什么不使用像以下那样的二传手注射?
class ovi_Exception extends Exception {
private $MySQL = NULL;
public function setMysqlAdapter($MySQL) {
$this->MySQL = $MySQL;
}
}