Полный вопрос должен быть, "Это корректно или является им некоторая ошибка, на которую я не могу рассчитывать?"
ПОЧЕМУ это корректное поведение?
Я работал с PDO больше и в особенности играл с выбирающими данными непосредственно в объекты. При выполнении, таким образом, я обнаружил это:
Если я выбираю данные непосредственно в объект как это:
$STH = $DBH->prepare('SELECT first_name, address from people WHERE 1');
$obj = $STH->fetchAll(PDO::FETCH_CLASS, 'person');
и имейте объект как это:
class person {
public $first_name;
public $address;
function __construct() {
$this->first_name = $this->first_name . " is the name";
}
}
Это показывает мне, что свойства присваиваются, перед __ конструкцию называют - потому что имена, которые все имеют, "являются именем", добавленным.
Эта некоторая ошибка (в этом случае, я могу/, рассчитывают на него), или это Способ, которым Это Должно Быть. Поскольку это - действительно вполне хорошая вещь путем, это в настоящее время работает.
По-видимому, по словам одного из специалистов по обслуживанию это не ошибка. Кто-то отправил его как ошибку в 2008, к которой ответ был 'не ошибка, прочитайте документы.
Однако я действительно хотел бы знать, ПОЧЕМУ это - корректное поведение.
После долгого чтения я думаю, что наконец-то нашел ответ: это работает так намеренно, и у вас есть возможность заставить его работать иначе.
Существует недокументированная константа PDO под названием PDO::FETCH_PROPS_LATE
, которую вы можете использовать, чтобы заставить свойства быть извлеченными в объект после его создания. Например:
$obj = $STH->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'person');
Приведет к тому, что свойства будут назначены ПОСЛЕ создания объекта, поэтому мой пример выше не изменит свойства вообще. Отключение PDO::FETCH_PROPS_LATE
, конечно, приведет к тому, что он будет действовать так, как описано в моем примере в исходном вопросе.
Похоже, что разработчики активно учитывали, что оба варианта поведения могут быть желательны, и предоставили вам возможность сделать любой из них. В документации это даже не объясняется - я читал список констант PDO, увидел это и попробовал.
Попробуйте использовать PDO :: FETCH_INTO вместо PDO :: FETCH_CLASS. Из документации:
PDO :: FETCH_INTO: обновляет существующий экземпляр запрошенного класса, сопоставляя столбцы результирующего набора с именованными свойствами в классе
Итак, вы должны сначала создать экземпляр, затем передайте экземпляр желаемому методу выборки.
При этом, да, это довольно нелогично, если FETCH_CLASS заполняется перед вызовом __construct. Ответ, указанный в списке рассылки, является стандартным ответом "RTM" методом копирования и вставки. Если FETCH_INTO работает, вы должны открыть ошибку в документации с предложенными улучшениями.