2013-05-30 41 views
0

我想構建一個子異常類(ovi_Exception),並遇到__construct()問題。我希望也能夠訪問在子Exception類我的MySQL類,通常我這樣做是通過以下:擴展異常類中斷getMessage()

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來說,這是相當新的。

謝謝。

回答

3

你爲什麼不使用setter注入,如:

class ovi_Exception extends Exception { 
    private $MySQL = NULL; 
    public function setMysqlAdapter($MySQL) { 
     $this->MySQL = $MySQL; 
    } 
} 
+0

ahaha幾乎在同一時間! :D – tftd

+0

@tftf是的,這往往是這種情況在stackoverflow ^^。 – antoox

+0

酷,這工作和有意義,謝謝。不知道爲什麼我應該得到一個downvote ... – artparks

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()沒有錯誤消息。