0

我正在尝试构建一个子异常类 ( 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 来说还是很新的。

谢谢。

4

2 回答 2

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()

于 2013-05-30T18:55:22.643 回答
3

为什么不使用 setter 注入,例如:

class ovi_Exception extends Exception {
    private $MySQL = NULL; 
    public function setMysqlAdapter($MySQL) {
        $this->MySQL = $MySQL;
    }
}
于 2013-05-30T18:56:17.083 回答