PHP PDO: Выбирающие данные как объекты - свойства, присвоенные ПРЕЖДЕ __ конструкция, называют. Это корректно?

Полный вопрос должен быть, "Это корректно или является им некоторая ошибка, на которую я не могу рассчитывать?"

ПОЧЕМУ это корректное поведение?

Я работал с 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, к которой ответ был 'не ошибка, прочитайте документы.

Однако я действительно хотел бы знать, ПОЧЕМУ это - корректное поведение.

11
задан Erik 19 May 2010 в 02:43
поделиться

2 ответа

После долгого чтения я думаю, что наконец-то нашел ответ: это работает так намеренно, и у вас есть возможность заставить его работать иначе.

Существует недокументированная константа PDO под названием PDO::FETCH_PROPS_LATE, которую вы можете использовать, чтобы заставить свойства быть извлеченными в объект после его создания. Например:

$obj = $STH->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'person');

Приведет к тому, что свойства будут назначены ПОСЛЕ создания объекта, поэтому мой пример выше не изменит свойства вообще. Отключение PDO::FETCH_PROPS_LATE, конечно, приведет к тому, что он будет действовать так, как описано в моем примере в исходном вопросе.

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

12
ответ дан 3 December 2019 в 07:11
поделиться

Попробуйте использовать PDO :: FETCH_INTO вместо PDO :: FETCH_CLASS. Из документации:

PDO :: FETCH_INTO: обновляет существующий экземпляр запрошенного класса, сопоставляя столбцы результирующего набора с именованными свойствами в классе

Итак, вы должны сначала создать экземпляр, затем передайте экземпляр желаемому методу выборки.

При этом, да, это довольно нелогично, если FETCH_CLASS заполняется перед вызовом __construct. Ответ, указанный в списке рассылки, является стандартным ответом "RTM" методом копирования и вставки. Если FETCH_INTO работает, вы должны открыть ошибку в документации с предложенными улучшениями.

2
ответ дан 3 December 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: