2012-01-17 4 views
9

У меня есть класс, который использует магические методы для хранения свойств. Вот упрощенный пример:Использование PDO :: FETCH_CLASS с помощью методов магии

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: Получение данных как объектов - присвоенных свойств ПЕРЕД вызовом __construct. Это правильно?] (Http://stackoverflow.com/questions/2862279/php-pdo-fetching-data-as-objects-properties-assigned-before-construct-is-ca) – outis

ответ

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

+0

@drrcknlsn: для сколько-нибудь« почему? » как есть, см. другой вопрос. Обратите внимание, что комментарии не предназначены для дополнительных вопросов, кроме просьб о разъяснении. – outis

+1

Я прочитал ссылку, которую вы вставили, но нет ответа, почему это поведение по умолчанию. Я прошу об этом в комментариях, потому что это недостаточно важно, чтобы гарантировать новый вопрос, ИМО, но я все еще хочу знать. – FtDRbwLXw6