完整的问题应该是“这是正确的还是我不能指望的错误?”
为什么这是正确的行为?
我一直在更多地使用 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 之前分配的 - 因为名称都附加了“是名称”。
这是一些错误(在这种情况下我不能/不会指望它)还是这就是它应该的方式。因为它目前的运作方式确实是一件非常好的事情。
Update
显然,根据一位维护者的说法 http://www.mail-archive.com/php-bugs@lists.php.net/msg116627.html这不是一个错误。有人在 2008 年将其作为错误发布,回复是“这不是错误,请阅读文档”。
但是,我真的很想知道为什么这是正确的行为。
经过大量阅读后,我想我终于找到了答案:它是故意以这种方式工作的,并且您可以选择让它以其他方式运行。
有一个几乎没有记录的 PDO 常量,称为PDO::FETCH_PROPS_LATE
您可以使用它来在构造对象后将属性提取到对象中。例如:
$obj = $STH->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'person');
将导致在创建对象后分配属性,因此我上面的示例根本不会修改属性。离开PDO::FETCH_PROPS_LATE
当然,关闭会导致它按照我在原始问题中的示例中描述的方式运行。
维护者似乎积极考虑到这两种行为可能都是可取的,并为您提供了选择其中一种的选择。该文档甚至没有解释它——我是读取 PDO 常量列表 http://us.php.net/manual/en/pdo.constants.php看到了它,并试了一下。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)