Использование PDO :: FETCH_CLASS с магическими методами - PullRequest
9 голосов
/ 17 января 2012

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

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 Ответ

13 голосов
/ 17 января 2012

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

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

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

...