代码之家  ›  专栏  ›  技术社区  ›  Erik

php pdo:以对象的形式获取数据-在调用\构造之前分配的属性。这是正确的吗?

  •  11
  • Erik  · 技术社区  · 14 年前

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

    为什么这是正确的行为?

    我一直在使用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";
      }
    }
    

    它向我展示了在调用uu构造之前已经分配了属性——因为所有的名称都附加了“is the name”。

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

    更新

    显然地, according to one of the maintainers 这不是错误。有人在2008年把它作为一个bug发布,对此的回复是“这不是bug,阅读文档”。

    不过,我很想知道为什么这是正确的行为。

    3 回复  |  直到 7 年前
        1
  •  12
  •   Erik    14 年前

    在读了很多书之后,我想我终于找到了答案:它是故意这样工作的,你可以选择让它以其他方式工作。

    有一个几乎没有记录的pdo常量 PDO::FETCH_PROPS_LATE 它可以用于在对象被构造后将属性提取到对象中。例如:

    $obj = $STH->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'person');
    

    将导致在创建对象后分配属性,因此上面的示例根本不会修改属性。离开 晚些时候拿道具 当然,off会使它按照我在原始问题中的示例中所描述的方式工作。

    维护人员似乎已经积极地考虑到这两种行为都是可取的,并且给了您选择其中一种。文档甚至没有解释——我是 reading through a list of PDO constants 看到了,就开枪了。

        2
  •  3
  •   Petah    12 年前

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

        3
  •  2
  •   Funk Forty Niner    7 年前

    尝试使用pdo::fetch\u而不是pdo::fetch\u类。 From the docs:

    pdo::fetch\u到:更新所请求类的现有实例,将结果集的列映射到类中的命名属性

    所以,您应该先创建实例,然后将实例传递给您想要的fetch方法。

    也就是说,是的,在调用_uuu结构之前填充fetch_类是相当违反直觉的。邮件列表上给出的答案是标准的复制粘贴“rtm”答案。如果将\带到工作中,您应该打开一个带有建议的增强功能的文档错误。