Php 使用PDO::FETCH_类和魔术方法

Php 使用PDO::FETCH_类和魔术方法,php,pdo,magic-methods,Php,Pdo,Magic Methods,我有一个类,它使用神奇的方法来存储属性。以下是一个简化的示例: class Foo { protected $props; public function __construct(array $props = array()) { $this->props = $props; } public function __get($prop) { return $this->props[$prop]; }

我有一个类,它使用神奇的方法来存储属性。以下是一个简化的示例:

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
后,为每个数据库行实例化此类的对象,如下所示(不起作用):

问题是
PDO::FETCH_CLASS
在设置属性值时,似乎不会触发类上的magic
\u set()
方法


如何使用PDO实现预期效果?

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

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

或者,创建一个实例并将其提取到其中(即,将提取模式设置为
PDO::fetch_into
)。

可能与Thank you重复,这很有效。出于好奇,在调用构造函数之前设置它们是否有性能优势?我不明白为什么
PDO::FETCH_PROPS_LATE
不会是默认行为…@drrcknlsn:关于“为什么”的问题,请参阅另一个问题。请注意,除了澄清请求之外,评论并不是针对其他问题。我确实阅读了您粘贴的链接,但没有回答为什么这是默认行为。我在评论中问这个问题是因为它的重要性不足以让我开始一个新的问题,IMO,但我仍然想知道。@drrcknlsn:另一个问题的答案和现在一样多。
$st->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Foo');