假设我有这样一门课:
Class User {
var $id
var $name;
}
我在php中使用pdo运行一个查询,如下所示:
$stm = $db->prepare('select * from users where id = :id');
$r = $stm->execute(array(':id' => $id));
$user = $r->fetchObject('User');
如果我vardump我的用户对象,它有所有其他类型的字段,我没有在用户类中定义。显然,我可以使我的查询特定化,以便它只返回我需要/想要的字段。但如果我不想那样做,有没有办法让它按我想的那样工作呢?
我喜欢fetchobject的概念,因为它是为我创建这个对象和设置成员变量的一行代码。我只是不希望它设置我在类中没有定义的变量。
编辑:
看来karim79是对的,fetch或fetchobject不会按照我想要的方式工作。在执行提取操作后,我添加了以下代码位以获得所需的结果。
$valid_vars = get_class_vars('User');
foreach (get_object_vars($user) as $key => $value) {
if (!array_key_exists($key, $valid_vars)) {
unset($user->$key);
}
}
显然不是最优雅的解决方案:我将扩展pdostatement类并添加我自己的方法fetchintoobject或类似的东西,然后自动执行这些未设置的操作。希望不会有太多开销,但我希望能够轻松地用一行代码获取一个对象:)
超级编辑:
多亏了马马尔的评论,我又回到了文档中。我发现了问题所在。http://us.php.net/manual/en/pdo.constants.php并向下滚动到pdo::fetch_类,它解释了如果类中不存在属性,则使用magic方法u set()。我在目标类中重写了该方法,tada可以工作。同样,不是最优雅的解决方案。但现在我明白了原因,这对我很重要:D
最佳答案
我不认为那是可能的。fetchObject
将创建指定为fetchObject
的$class_name
参数的类名称的实例(默认为stdclass)。它不会检查具有相同名称的现有类并创建实例,只将值分配给与结果中的列名匹配的成员变量。我建议依赖一些更无聊的东西,比如:
$user = new User($result['id'], $result['name']);
这当然意味着给用户类一个构造函数:
Class User {
var $id
var $name;
public function __construct($id, $name)
{
$this->id = $id;
$this->name = $name;
}
}