Я заменяю свой старый уровень базы данных новой версией на основе PDO.
Однако я столкнулся с проблемой:
При извлечении объектов с помощью fetchObject
я могу передать аргументы для конструктора объектов.
Однако теперь я переношу на класс, который имеет несколько подклассов, все они хранятся в одной таблице, и я хочу использовать FETCH_CLASSTYPE
. Это означает, что я должен использовать обычный метод fetch()
к которому я не могу передать аргументы конструктора.
Есть ли другой способ сделать это?
Я мог бы переименовать конструктор на что-то еще и называть его вручную, но я хотел бы получить чистое решение.
Кажется, что нет встроенного решения. В любом случае, эта часть API не выглядит такой хорошей. Вы можете использовать обходной путь:
$stmt->setFetchMode(PDO::FETCH_ASSOC); while ($row = $stmt->fetch()) { /* "Factory" */ $obj = new $row['class_name_column']('constructor', 'args'); unset($row['class_name_column']); foreach ($row as $key => $value) { $obj->$key = $value; } var_dump($obj); }
с$stmt->setFetchMode(PDO::FETCH_ASSOC); while ($row = $stmt->fetch()) { /* "Factory" */ $obj = new $row['class_name_column']('constructor', 'args'); unset($row['class_name_column']); foreach ($row as $key => $value) { $obj->$key = $value; } var_dump($obj); }
Я думаю, что совершенно чисто вызвать метод инициализации на возвращаемом экземпляре сразу после извлечения.
Это ошибка PHP, указанная как # 62567
Вы можете обойти это, передав в качестве второго аргумента любое имя класса с конструктором