父类方法返回父对象而非子类返回的对象

时间:2014-04-26 10:09:39

标签: php object methods extends

我有2个类 - 一个扩展DatabaseMaster类的User类。我在DatabaseMaster类中有一个create方法,如下所示......

  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 ".static::$table_name." (";
    $sql .= join(", ", array_keys($attributes));
    $sql .= ") VALUES (";
    $sql .= join(", ", array_values($question_marks));
    $sql .= ")";
    $query = $handler->prepare($sql);
    $query->execute($place_holder);
}

这将获取调用它的类的属性,并在函数中循环它们以创建SQL字符串。工作良好。

如果我创建一个新用户,例如vardump我得到的用户....(注意我只是将一个可见的密码作为james ...其余为NULL仅用于说明目的)

   object(User)#2 (14) {  
      ["id"]=> NULL ["visible_password"]=> string(5) "James" 
      ["hashed_password"]=> NULL 
      ["temp_hashed_password"]=> NULL 
      ["email"]=> NULL 
      ["first_name"]=> NULL 
      ["last_name"]=> NULL 
      ["position"]=> NULL 
      ["location"]=> NULL
      ["city"]=> NULL 
      ["country"]=> NULL 
      ["institution"]=> NULL 
      ["interests"]=> NULL 
      ["profile_comment"]=> NULL }

我在DatabaseMaster类中也有一个find_by_id()方法....

     public static function find_by_id($id=0) {
        $result_array = static::find_by_sql("SELECT * FROM ".static::$table_name." WHERE id={$id} LIMIT 1");
        return !empty($result_array) ? array_shift($result_array) : false;

}

现在,如果我使用这个,比如说id = 223并且vardump结果我得到....

         object(DatabaseMaster)#4 (14) { 
           ["id"]=> string(3) "301" 
           ["visible_password"]=> string(5) "James" 
           ["hashed_password"]=> NULL 
           ["temp_hashed_password"]=> NULL 
           ["email"]=> NULL 
           ["first_name"]=> NULL 
           ["last_name"]=> NULL 
           ["position"]=> NULL 
           ["location"]=> NULL 
           ["city"]=> NULL 
           ["country"]=> NULL 
           ["institution"]=> NULL 
           ["interests"]=> NULL 
           ["profile_comment"]=> NULL }

我需要将它作为User对象返回....我可以理解为什么它不是(有点)但是因为它们是find_by_id方法中的静态调用,为什么这不是User对象.... / p>

您的意见表示赞赏......

1 个答案:

答案 0 :(得分:0)

找到解决方案......

在find_by_id()中;方法包含另一种方法find_by_sql();

public static function find_by_sql($sql){
global $handler;
$query = $handler->query($sql);
$class = get_class($this);
$object_array = $query->fetchAll(PDO::FETCH_CLASS, $class);
return $object_array;
  }

解决方案是将其更改为

public static function find_by_sql($sql){
global $handler;
$query = $handler->query($sql);
$class = get_called_class();
$object_array = $query->fetchAll(PDO::FETCH_CLASS, $class);
return $object_array;

}