完整的问题应该是“这是正确的还是一些我不能指望的错误?”
WHY is this correct behavior?
我一直在使用PDO,特别是直接将数据提取到对象中.在这样做的时候我发现了这一点:
如果我直接将数据直接提取到如下对象中:
$STH = $DBH->prepare('SELECT first_name,address from people WHERE 1'); $obj = $STH->fetchAll(PDO::FETCH_CLASS,'person');
并有一个这样的对象:
class person { public $first_name; public $address; function __construct() { $this->first_name = $this->first_name . " is the name"; } }
它告诉我,在调用__construct之前,这些属性是被赋值的,因为这些名称都附加了“是名称”.
这是一些错误(在这种情况下,我不能/不会指望)或者这是它应该的方式.因为它现在的工作方式真的很好.
更新
显然,according to one of the maintainers这不是一个bug.有人在2008年将其发布为错误,答复是“它不是错误,阅读文档”.
不过,我真的很想知道为什么这是正确的行为.
经过很多阅读,我想我终于遇到了这个答案:这样做有意思,你可以选择使它不起作用.
有一个大多数未公开的PDO常数称为PDO :: FETCH_PROPS_LATE,您可以使用它来使属性在构造后被提取到对象中.例如:
$obj = $STH->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE,'person');
将导致在创建对象之后分配属性,因此我上面的示例根本不会修改属性.离开PDO :: FETCH_PROPS_LATE当然会导致它像原来的问题的例子中所描述的那样行事.
维护者似乎已经积极地考虑到这两种行为可能是可取的,并给予您选择这样做.文件甚至没有解释 – 我是reading through a list of PDO constants,看到它,并给了它一枪.