可以说我有一个这样的类:我可以使PDOStatement-> fetchObject不使用非成员变量吗?
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权利和获取或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或类似的东西,并自动做这些取消设置。但愿不应该是太大的开销,但我希望能够轻松地读取到一个对象,具有1行代码:)
SUPER编辑:
由于mamaar的评论,我再次回到了文档。我发现问题是什么。 http://us.php.net/manual/en/pdo.constants.php并向下滚动到PDO :: FETCH_CLASS,并说明如果类中不存在属性,则使用魔术方法__set()。我重写了我的目标课堂和田田的方法,工作。再次,不是最优雅的解决方案。但现在我明白了为什么,这对我很重要:D
对不起,我有点迟到了,但我有同样的问题,因为你,所以我只是发现这个职位。在这里了解了这个问题之后,我已经决定在所有的类中有一个用于重写'__set()'的基类更容易,为什么不能从已经创建了__set()'方法的基类继承这样的类?抛出异常? – AgentConundrum 2010-10-04 05:03:23