2012-01-17 101 views
9

我有一个使用魔术方法来存储属性的类。下面是一个简单的例子:使用PDO :: FETCH_CLASS和Magic方法

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完成所需的效果?

+1

[PHP PDO:将数据提取为对象 - 调用BEFORE __construct时分配的属性。这是正确的?](http://stackoverflow.com/questions/2862279/php-pdo-fetching-data-as-objects-properties-assigned-before-construct-is-ca) – outis 2012-01-17 17:24:33

回答

12

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

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

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

+1

谢谢你,这个作品。出于好奇,在调用构造函数之前设置它们是否具有性能优势?我不明白为什么'PDO :: FETCH_PROPS_LATE'不会成为默认行为... – FtDRbwLXw6 2012-01-17 17:46:40

+0

@drrcknlsn:尽可能多的“为什么?”如有,请参阅其他问题。请注意,除了要求澄清之外,意见并不意味着其他问题。 – outis 2012-01-17 17:52:28

+1

我确实阅读了您粘贴的链接,但没有回答为什么这是默认行为。我在评论中问这个问题,因为它不够重要,不值得开一个新的问题,IMO,但我仍然想知道。 – FtDRbwLXw6 2012-01-17 18:17:41