2012-03-30 87 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