2014-04-25 144 views
0

我在类继承中遇到了一些困难。我有5个类,所有这些类都通过创建,更新和删除方法来访问我的数据库,这些方法使得我可以将它们推送到MasterDatabase类中,然后让它们都扩展这个类。我遇到的问题是基本的继承概念。我已经浏览了特种部队,许多人都问过类似的问题,但不是完全一样。从子类调用父方法

class DatabaseMaster { 

    public function create() { 
     $attributes = $this->attributes(); 
     $question_marks = array(); 
     foreach ($attributes as $key => $value) { 
     $question_marks[] = "?"; 
     } 
     $place_holder = array_intersect_key($attributes, get_object_vars($this)); 
     $place_holder = array_values($place_holder); 
     $sql = "INSERT INTO ".self::$table_name." ("; 
     $sql .= join(", ", array_keys($attributes)); 
     $sql .= ") VALUES ("; 
     $sql .= join(", ", array_values($question_marks)); 
     $sql .= ")"; 
     $query = $handler->prepare($sql); 
     $query->execute($place_holder); 
    } 

} 

现在,如果我有一个类的用户。我希望这扩展DatabaseMaster,我认为它不能继承这个创建函数,因为它是上面的?例如,我的问题是在方法中引用$ this-> attributes。 DatabaseMaster没有属性,但我的用户类当然是。如果我运行$ user-> create();它不起作用,我因此承担了这一点。如何克服这个问题?此刻,我非常抱歉使用SOF!

这个工程....

public function create() { 
    $attributes = $this->attributes(); 
    $question_marks = array(); 
    foreach ($attributes as $key => $value) { 
    $question_marks[] = "?"; 
    } 
    $place_holder = array_intersect_key($attributes, get_object_vars($this)); 
    $place_holder = array_values($place_holder); 
    $sql = "INSERT INTO users ("; 
    $sql .= join(", ", array_keys($attributes)); 
    $sql .= ") VALUES ("; 
    $sql .= join(", ", array_values($question_marks)); 
    $sql .= ")"; 
    $query = $handler->prepare($sql); 
    $query->execute($place_holder); 
} 

所以我的问题是清楚的....一个人如何使表名的方法,动态的,所以,它是指当孩子调用它的孩子?

+0

这里的问题是对SELF :: $ TABLE_NAME的引用。你能以这种方式在父方法中调用'self',并期望它在孩子调用方法时引用childs表名吗? – GhostRider

回答

0

可以解释方法“原样”。请看下面的例子:

class P { 

     function create() { 
       echo $this->attributes . "\n"; 
     } 
} 

class C extends P { 
     public $attributes = "hello!"; 
} 

$c = new C; 

$c->create(); 

这就像你所期望的是它,并且在孩子上定义父create()方法相呼应的$attributes值。

+0

你没有错,我可以看到你的例子工作正常。我无法让我的用户继承这个创建功能,尽管.... – GhostRider