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

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

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

Свойства объекта заполняются напрямую из данных запроса — это прямое присвоение значения свойствам. В PHP 8.4 появились хуки свойств. Будут ли вызваны хуки свойств при таком создании объекта? Другими словами, будут ли присваиваемые значения свойств из базы данных пропущены через хуки свойств перед операцией присваивания?
  • Вопрос задан
  • 331 просмотр
Подписаться 3 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Skillbox
    PHP-разработчик. Базовый уровень
    3 месяца
    Далее
Решения вопроса 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();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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