2012-03-30 91 views
0

我想從我的數據庫加載2個對象。第一個對象是第一個對象(第一個對象是PHP和數據庫)的父對象和第二對繼承對象。PHP - MVC和表繼承

我已經創建了2類: (這只是一個樣品沒有真正的代碼,所以不要嘗試解決此;-))

class A{ 
    ... 
    public static function get($id){ 
     $query = "SELECT id,field1,field2 FROM table_A WHERE id = $id"; 
     $result = request($query); 
     return load_object_A_instance($result); 
    } 
    ... 
} 

class B extends A{  
    ... 
    public static function get($id){ 
     $query = "SELECT id,field3,field4 FROM table_B WHERE id = $id"; 
     $result = request($query); 
     return load_object_B_instance($result); 
    } 
    ...  
} 

我會實例化對象B有自己的屬性和在「相同」動作中使用對象A的屬性。我怎樣才能做到這一點 ?

我有一些想法,但我不知道如何來實現:

class B extends A{  
    ... 
    public static function get($id){ 
     $query = "SELECT id, field3, field4 FROM table_B WHERE id = $id"; 
     $result = request($query); 
     $B = load_object_B_instance($result); 

     if($B != empty/null){ 
      $B = merge(A::get($B->id),$B); // <== that's the part I don't know how to implement 
     } 
     return $B; 
    } 
    ...  
} 

編輯: 我找到了第一個解決方案(這是不乾淨的,但...)

echo $obj->name; //show: carlos 
echo $obj2->lastname; //show: montalvo here 
$obj_merged = (object) array_merge((array) $obj, (array) $obj2); 
$obj_merged->name; //show: carlos 
$obj_merged->lastname; //show: montalvo here; 

解決方法發現在這裏:How do I merge two objects?

+0

http://stackoverflow.com/questions/2994758/function-overloading-and-overriding-in- php 這是否回答你想要做的事情? – 2012-03-30 12:54:27

回答

0

只因爲你使用類,不會使它OOP。如果你想從兩個數據源合併數據,你可以從他們身上,然後第3 partt信息相結合,則:

$foo = new A($connection); 
$bar = new B($connection); 

$data = $foo->get(42) + $bar->get(1); 

你也應該看看DataMapper模式,並觀看適當OOP的問題的一些視頻:

+0

就像我說的那樣,它只是一個代碼示例來顯示我的問題。我所有的「真實」代碼都是OO(但是你的鏈接被捕獲)。我不明白這個部分:「$ data = $ foo-> get(42)+ $ bar-> get(1);」 如何將對象添加到其他對象? PS:我不認爲這是一件好事,當你想要實例化一個對象時,將你的數據庫連接傳遞給構造函數。 – Airmanbzh 2012-03-30 13:06:19

+0

@Airmanbzh,如果你的對象將負責與數據庫直接通信,然後提供它與連接對象的連接,這是正確的做法。或者你是使用'mysql_ *'作爲API訪問數據庫的石器時代的人之一?! – 2012-03-30 13:08:22

+0

我的對象不直接與我的數據庫進行通信。這只是我桌子的一種表現。 – Airmanbzh 2012-03-30 13:12:30