我有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>
您的意见表示赞赏......
答案 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;
}