2011-10-31 62 views
0

花了半個小時找到一個適當的,自我解釋的標題這個問題後,我終於放棄了。對此我表示歉意,我不是以英語爲母語的人。php類多次延伸

無論如何,問題是關於使用一個特定的類來擴展多次 - 不是多重繼承。因此,假設有兩個倉庫類來自同一函數調用:

public function someFunction() 
{ 
    $qp = QuestionRepository(); 
    $cp = CommentRepository(); 
} 

和QuestionRepository是這樣的:

class QuestionRepository extends PDO 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 
} 

的CommentRepository是這樣的:

class CommentRepository extends PDO 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 
} 

而PDO類是像這個:

class PDO 
{ 
    public function __construct() 
    { 
     $pdo = new PDO(...); 
    } 
} 

所以基本上,PDO類擴展了兩次,因此啓動了兩個PDO實例。然而,問題是這是否意味着2個不同的mysql連接 - 這會導致性能下降,或者pdo認識到存在活動連接,因此它只是忽略第二個實例?

+0

你是否熟悉['static'](http://php.net/manual/en/language.oop5.static.php)和[singleton pattern](http://php.net/manual/en/) language.oop5.patterns.php#language.oop5.patterns.singleton)? –

+0

不是真的,我還在學習。我會給它一張支票 – Shaokan

+1

查看我編輯的評論。單態模式與'static'結合在一起可能特別有用。 –

回答

1

你可以在PDO中爲mysql連接聲明一個「靜態」字段。這樣,每個實例中都會使用相同的字段,而不管哪個子類負責實例化。

它還要求您靜態訪問該字段; PDO::$mysql_link;

如果您聲明該字段時未指定可見性,則該字段將是公開的,這意味着只要定義了PDO,就可以從任何地方引用相同的字段。

0

我不確定是否有來自PDO的支票。

但你有不同的選擇。構建一個Singelton PDO對象並在每個類中使用此Singleton或使用依賴關係注入。這意味着建立一個PDO對象,並將其注入到你在構造函數(構造函數注入)類或使用其他功能(setter注入)

我會依賴注入運行,所以你可以很容易地改變你的「數據庫訪問對象」

+0

這實際上是我在做的事情之前,但我並不滿意:)雖然 – Shaokan

+0

相信我,不要用繼承來解決這個問題。遲早你會後悔的。使用依賴注入或單例。 – evildead

+0

在第一個視圖中,使用依賴注入看起來不太自然,因爲代碼感覺很奇怪。你認爲你有點濫用。我知道你的感受:)爲了讓代碼更美觀,在它周圍建立一個工廠,並將注入從你的眼睛中隱藏:) – evildead