从子类调用父方法

时间:2014-04-25 17:16:49

标签: php class inheritance methods parent-child

我在继承类时遇到了一些困难。我有5个类,所有这些类都使用create,update和delete方法访问我的数据库,我已经将它们抽象出来,这样我就可以将它们推送到MasterDatabase类中,然后让它们都扩展这个类。我遇到的问题是基本的继承概念。我查看了SOF,很多人都提出了类似的问题,但不是这个问题。

  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->属性。 DatabaseMaster没有属性,但我的User类当然没有。如果我运行$ 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);
}

所以我的问题显然是......如何让表名在方法中动态化,以便在孩子调用它时引用孩子?

1 个答案:

答案 0 :(得分:0)

可以解释方法" as-is"。请考虑以下示例:

class P {

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

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

$c = new C;

$c->create();

这正如你所期望的那样,并且父级的create()方法回应了孩子中定义的$attributes的值。