Задать вопрос
polyanin
@polyanin
Golang, PHP & Symfony developer

Будут ли вызваны в PHP 8.4 хуки свойств при создании объекта через PDO fetchObject?

При создании объекта через PDO fetchObject PDO создаёт инстанс указанного класса без вызова конструктора (если не передавать аргументы в fetchObject($class, $ctorArgs)).

Свойства объекта заполняются напрямую из данных запроса — это прямое присвоение значения свойствам. В PHP 8.4 появились хуки свойств. Будут ли вызваны хуки свойств при таком создании объекта? Другими словами, будут ли присваиваемые значения свойств из базы данных пропущены через хуки свойств перед операцией присваивания?
  • Вопрос задан
  • 142 просмотра
Подписаться 3 Простой 2 комментария
Решения вопроса 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Проверка показала, что будут:
class Tmp
{
    public string $name
    {
        set (string $name) {
            $this->name = strtoupper($name);
        }
    }
}

var_dump($pdo->query("SELECT 'lowercase' as name")->fetchObject(Tmp::class));

object(Tmp)#550 (1) { ["name"]=> string(9) "LOWERCASE" }
Ответ написан
Vamp
@Vamp
  1. Создаётся объект без вызова конструктора.
  2. В объекте ищется поле с именем, совпадающим с именем колонки.
    1. Если поле найдено, вызывается хук set. Даже если у поля область видимости private.
    2. Если поле найдено, а хука нет, в поле просто сетается значение. Даже если у поля область видимости private.
    3. Если не найдено, вызывается магический метод __set
    4. Если __set отсутствует, создаётся динамическое поле с именем колонки.

  3. Вызывается конструктор.


PDO::FETCH_PROPS_LATE не работает совместно с методом fetchObject. Конструктор по-прежнему вызывается только в конце. Чтобы переставить вызов конструктора наверх, нужно вызывать методы setFetchMode и fetch:
$stmt = $pdo->query('SELECT * FROM tbl_name');
$stmt->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, $class, $constructorArgs);
$obj = $stmt->fetch();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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