扩展异常类中断getMessage()

时间:2013-05-30 18:44:34

标签: php exception-handling

我正在尝试构建一个子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来说还是比较新的。

感谢。

2 个答案:

答案 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;
    }
}