【问题标题】:Using PDO::FETCH_CLASS with Magic Methods将 PDO::FETCH_CLASS 与魔术方法一起使用
【发布时间】:2012-02-12 12:04:17
【问题描述】:

我有一个使用魔术方法来存储属性的类。这是一个简化的例子:

class Foo {
    protected $props;

    public function __construct(array $props = array()) {
        $this->props = $props;
    }

    public function __get($prop) {
        return $this->props[$prop];
    }

    public function __set($prop, $val) {
        $this->props[$prop] = $val;
    }
}

我正在尝试在执行后为PDOStatement 的每个数据库行实例化此类的对象,如下所示(不起作用):

$st->setFetchMode(PDO::FETCH_CLASS, 'Foo');

foreach ($st as $row) {
    var_dump($row);
}

问题是PDO::FETCH_CLASS 在设置属性值时似乎没有触发我的类上的神奇__set() 方法。

如何使用 PDO 达到预期的效果?

【问题讨论】:

标签: php pdo magic-methods


【解决方案1】:

PDO 的默认行为是在调用构造函数之前设置属性。在调用构造函数后设置获取模式设置属性时,在位掩码中包含PDO::FETCH_PROPS_LATE,这将导致在未定义的属性上调用__set魔术方法。

$st->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Foo');

或者,创建一个实例并获取它(即将获取模式设置为PDO::FETCH_INTO)。

【讨论】:

  • 谢谢,这行得通。出于好奇,在调用构造函数之前设置它们是否有性能优势?我不明白为什么PDO::FETCH_PROPS_LATE 不是默认行为...
  • @drrcknlsn:“为什么?”有,请参阅另一个问题。请注意,除了要求澄清之外,cmet 并不意味着其他问题。
  • 我确实阅读了您粘贴的链接,但没有回答为什么这是默认行为。我在 cmets 中问这个问题,因为它的重要性不足以保证提出一个新问题,IMO,但我仍然想知道。
  • @drrcknlsn:另一个问题的答案和答案一样多。
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 2019-08-27
  • 2017-03-11
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多