PHP PDO:将数据作为对象获取—在调用_构造之前指定的属性。这是正确的吗?

PHP PDO:将数据作为对象获取—在调用_构造之前指定的属性。这是正确的吗?,php,pdo,Php,Pdo,完整的问题应该是“这是正确的还是我不能指望的某个bug?” 为什么这是正确的行为 我一直在使用PDO,尤其是直接将数据提取到对象中。在这样做的过程中,我发现: 如果我直接将数据提取到如下对象中: $STH = $DBH->prepare('SELECT first_name, address from people WHERE 1'); $obj = $STH->fetchAll(PDO::FETCH_CLASS, 'person'); class person { publi

完整的问题应该是“这是正确的还是我不能指望的某个bug?”

为什么这是正确的行为

我一直在使用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";
  }
}
有这样一个物体:

$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";
  }
}
它告诉我,属性是在调用_构造之前分配的——因为所有名称都附加了“is the name”

这是某种错误(在这种情况下,我不能/不会指望它),还是应该这样。因为它现在的工作方式真的很不错

更新 显然,这不是一个bug。2008年,有人将其作为一个bug发布,对此的回复是“这不是bug,请阅读文档”


然而,我真的很想知道为什么这是正确的行为。

尝试使用PDO::FETCH_而不是PDO::FETCH_类

PDO::FETCH_INTO:更新请求类的现有实例,将结果集的列映射到类中的命名属性

因此,首先创建实例,然后将实例传递给所需的获取方法


这就是说,是的,在调用u构造之前填充FETCH_类是违反直觉的。邮件列表上给出的答案是标准的复制粘贴“RTM”答案。如果FETCH_进入工作状态,您应该打开一个带有建议增强功能的文档错误。

经过大量阅读,我想我终于找到了答案:它是故意这样工作的,您可以选择让它以其他方式运行

有一个名为
PDO::FETCH_PROPS_LATE
的大部分未记录的PDO常量,您可以使用它在构建对象后将属性提取到对象中。例如:

$obj = $STH->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'person');
将导致在创建对象后指定属性,因此我上面的示例根本不会修改属性。当然,关闭
PDO::FETCH_PROPS_LATE
会导致它按照我在原始问题示例中所述的方式工作


维护人员似乎已经积极地考虑到这两种行为都是可取的,并给了您选择两者之一的权利。文档甚至没有解释它——我曾经看到过它,并对它进行了尝试。

原因是,当您将对象序列化到数据库或字符串时,您(通常)不想在取消序列化时重新初始化属性

我并不是在试图回避这种行为——我觉得这很神奇。我正在努力确保它“按预期运行”,并找出“原因”。啊,这是个好问题。不幸的是,我认为php内部构件之外的任何人都无法回答这个问题,除非您决定深入研究PDO源代码!我已经过去了45分钟左右。。。“但是这比我的工资等级高了太多了。”查尔斯
啊,那是个好问题。不幸的是,我认为php内部构件之外的任何人都无法回答这个问题,除非您决定深入研究PDO源代码通过反射完成。你可以打赌,这是不容易找到的。我非常需要我正在写的最新的获取和orm(使用_set),虽然我在几个月前读过一篇关于它的帖子,但我在谷歌上花了大约半个小时才再次挖掘到有关常数的信息。谢谢你的常数列表。