2009-11-06 58 views
1

我有一個類,如:類呼叫的函數在另一個類

<?PHP 

abstract class dbCon 
{ 
    public function OpenConnection() 
    { 
      // Do Something; 
      // On error: 
      $this->ShowError(); 
    } 
    abstract function ShowError(); 
} 

class ErrorHandling extends dbCon 
{ 
    public function ShowError() 
    { 
     // Show error 
    } 
} 
?> 

有在上面的代碼中的缺陷。我想從抽象類中調用ShowError(),但它是接口定義的地方。如何處理這個?

+1

我看不出哪裏出了問題。我運行代碼,它工作正常。函數ShowError將被委派給實例的具體類中的方法(所以如果你的對象被創建爲ErrorHandling,它將調用ErrorHandling的ShowError())。這稱爲多態性。你能告訴我你說的缺陷在哪裏嗎? – NawaMan 2009-11-06 10:58:36

+0

@NawaMan:我認爲它不會被定向到ErrorHandling類中的ShowError()。我不是在遵循它如何認識到ShowError()存在於不同的類中? – RKh 2009-11-06 11:03:54

+0

@Rohit:請看我的回答。歡呼!!! – NawaMan 2009-11-06 11:15:04

回答

0

我建議你閱讀關於Polymorphism

來自父類的ShowError()的調用將由實例的類確定,並在運行時完成。

爲了證明,考慮下面的代碼:

<?PHP 

abstract class dbCon { 
    public function OpenConnection() { 
      // Do Something; 
      // On error: 
      $this->ShowError(); 
    } 
    abstract function ShowError(); 
} 

class ErrorHandling extends dbCon { 
    public function ShowError() { 
     // Show error 
     echo "Error is here\n"; 
    } 
} 
class WarningHandling extends dbCon { 
    public function ShowError() { 
     // Show waring 
     echo "Warning is here\n"; 
    } 
} 

$ErrorHandling = new ErrorHandling(); 
$ErrorHandling->OpenConnection(); 

$WarningHandling = new WarningHandling(); 
$WarningHandling->OpenConnection(); 

?>

運行時,您將獲得:

Error is here 
Warning is here 

爲什麼?

因爲,第一個ShowError()是來自ErrorHandling類型的對象。 PHP看到該對象來自具體類型ErrorHandling,所以當從OpenConnection調用ShowError()時,php使用來自對象類型(ErrorHandling)的函數。

第二個ShowError()調用來自WarningHandling的對象,所以PHP使用的是WarningHandlingShowError()

仔細看看Polymorphism。多態性是面向對象最重要的概念之一(因爲它只是基於對象的面向對象而缺失的一個概念)。

希望這會有所幫助。

+0

如果你的答案在我的上面翻了一倍或更多 - 恭喜你,如果它的確如此,那麼稱爲ErrorHandling的東西在任何地方打開連接都應該讓開發者停下來。我想到的第一件事可能是連接到其他地方的日誌系統,但在這種模式下,任何任意數據庫交互都可能導致錯誤。從概念上來說,這種奇怪的想法應該是一個警告信號。 – 2009-11-06 11:19:50

+0

我認爲如果是這種情況,通過ErrorHandling實例調用OpenConnection()並不好。什麼纔是正確的做法? – RKh 2009-11-06 11:21:49

+0

@Ed Carrel:是的,我同意這是一個奇怪的設計決定。但這不是重點。我試圖展示的是父對象可以調用抽象方法。實際執行將根據創建對象的具體類來確定。這是多態性的要點。 – NawaMan 2009-11-06 12:06:02

1

你可以實現自己的異常處理程序

class Exception_Handler extends Exception { 
    ... 
} 

class DB_Connection { 
    try { 
     throw new Exception_Handler('Cannot connect to DB: ' . $exception->getMessage() . '.'); 
    } catch (Exception_Handler $exception) { $exception->show(); } 
} 

更多內容:http://www.w3schools.com/php/php_exception.asp