Использование 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?


person FtDRbwLXw6    schedule 17.01.2012    source источник


Ответы (1)


По умолчанию PDO устанавливает свойства перед вызовом конструктора. Включите PDO::FETCH_PROPS_LATE в битовую маску, когда вы устанавливаете режим выборки для установки свойств после вызова конструктора, что приведет к вызову магического метода __set для неопределенных свойств.

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

В качестве альтернативы создайте экземпляр и выполните выборку в него (т. е. установите режим выборки на PDO::FETCH_INTO).

person outis    schedule 17.01.2012
comment
Спасибо, это работает. Из любопытства, есть ли преимущество в производительности при их установке перед вызовом конструктора? Я не понимаю, почему PDO::FETCH_PROPS_LATE не будет поведением по умолчанию... - person FtDRbwLXw6; 17.01.2012
comment
@drcknlsn: почему? как есть, см. другой вопрос. Обратите внимание, что комментарии не предназначены для дополнительных вопросов, кроме запросов на разъяснения. - person outis; 17.01.2012
comment
Я прочитал ссылку, которую вы вставили, но нет ответа, почему это поведение по умолчанию. Я спрашиваю об этом в комментариях, потому что это недостаточно важно, чтобы открывать новый вопрос, ИМО, но я все же хочу знать. - person FtDRbwLXw6; 17.01.2012
comment
@drrcknlsn: на другой вопрос столько же ответов, сколько и есть. - person outis; 17.01.2012