2010-03-17 78 views
2

我在學習自己從基於函數的PHP編碼轉向OOP。這是情況:OOP初學者:classB擴展classA。 classA已經是對象。在classB中需要的方法.. etc

ClassA包含許多基本的工具方法(功能)。它是__construct進行數據庫連接。 ClassB擁有基於特定活動的特定方法(提取小部件)。 ClassB擴展爲ClassA,因爲它使用了一些基本工具,例如數據庫調用。

在一個php文件中,我創建了一個$a_class = new ClassA對象(因此創建了一個新的數據庫連接)。

現在我需要一個方法ClassB。我做$b_class = new ClassB;並調用一個方法,它使用的方法從它的parent::ClassA

在這個例子中,我有ClassA'used'兩次。曾經作爲對象,並通過呼叫parent::,因此ClassA創建另一個數據庫連接(或不?)。

那麼什麼是這個基本類父,子(擴展)情況的最佳設置?我只想做一個連接當然?我不喜歡把這個對象轉發給ClassB,像這樣$ b_class = new ClassB($ a_object);或者是最好的方法?

感謝您與我的思維,並幫助:d

+1

嗨,歡迎來到SO !.這是一個設計問題,爲了幫助您,我們需要更多地瞭解您的問題域。只要描述你的課程就是這樣做的。 – user187291 2010-03-17 13:02:00

+0

感謝大家的所有意見。我去設置一個'單身'$ classA = classA :: getInstance();在每個classB__construct中都有。我希望它能幫助正在閱讀本文的其他人。 :d – Yvo 2010-03-17 17:20:20

回答

0

可能您擁有數據庫連接,這兩個類A和B可以連接到另一個對象。而且它的這個類只負責一個連接。 你可以看看這個單身人士模式

1

看起來你根本不需要類A的實例。確保類B在使用像這樣的繼承之前真的是is A類。如果你不確定,看看構圖。

1

從我在你的描述中收集到的信息,聽起來像B類不應該真正從A類繼承。問問你自己 - B真的是A的「增強版」嗎?如果不是,B只是使用A的一些實用工具,它應該只調用它的方法,或者編寫它(包含它作爲成員變量)。

順便說一句,我不認爲你應該連接到A的構造函數中的數據庫,除非您在其周圍放置某種保護以防止重複連接。可能更適合使用Connect()和Disconnect()函數,以便在您和未連接時很好理解。

+0

B確實不是A的增強版本。由於簡單的parent :: method()訪問,我使用擴展。假設這將導致來自__constructor的數據庫連接,而不必每次都創建新的ClassA對象,那麼從classB調用classA中的方法會更好。 在classB的__construct中設置對類A的引用,而不是通過$ this-> classA訪問父::會是一個很好的解決方案嗎? 你說得對,__construct不應該有一個數據庫連接,但它使我的情況更好:s。 – Yvo 2010-03-17 13:26:53

+0

是的,當B被構建時,它可以創建一個新的A,並保存在$ this-> myA中。這就是構圖的含義。當然,如果多個對象需要訪問同一個數據庫連接,情況會變得更加複雜。你不希望每個人都創建自己的A並建立多個連接。這就是Felix建議靜態連接的原因。但是,過度使用靜態變量也會導致你試圖逃避的那種混亂。 – Tesserex 2010-03-17 13:33:24

1
$class_a = new ClassA(); 
$class_b = new ClassB($class_a); 

class ClassB { 
    private $class_a; 

    public function __construct(ClassA $class_a) { 
     $this->class_a = $class_a; 
    } 
} 

如果我確實理解你想要做的事情。通過這種方式,您可以在ClassB的每種方法中都可以使用ClassA方法,而無需複製到數據庫的連接。

+0

你確實明白!這也是我用了一段時間,但我認爲這樣的標準問題並不是很漂亮! 由於要訪問class_b方法,因此需要創建一個class_a對象,因此它並不是我喜歡的'封鎖盒'。但如果這是我能接受的標準praktice。 – Yvo 2010-03-17 15:02:46

+0

你可以在ClassB中實例化ClassA,或者如果更多的類需要訪問ClassA,那麼你可以使用@solomongaby指出的Singleton/Factory模式。 – mhitza 2010-03-17 15:32:13

+0

@Yvo,mhitza的回答非常合理。此解決方案爲您提供最大的靈活性和最小的潛在錯誤。 – 2013-02-13 09:18:23

相關問題