Чтобы восстановить состояние объекта, который был сохранен, я хотел бы создать пустой экземпляр класса без вызова его конструктора, чтобы позже установить свойства с помощью Reflection .
Единственный способ, которым я нашел, как это делает Doctrine , – создать поддельную сериализацию объекта и unserialize()
:
function prototype($class) { $serialized = sprintf('O:%u:"%s":0:{}', strlen($class), $class); return unserialize($serialized); }
Есть ли другой, менее хакерский способ сделать это?
Я ожидал найти такой способ в Reflection, но я этого не сделал.
Обновление: ReflectionClass :: newInstanceWithoutConstructor доступен с PHP 5.4!
Другой способ – создать дочерний элемент этого класса с и пустым конструктором
class Parent { protected $property; public function __construct($arg) { $this->property = $arg; } } class Child extends Parent { public function __construct() { //no parent::__construct($arg) call here } }
а затем использовать тип Child:
$child = new Child(); //set properties with reflection for child and use it as a Parent type
По определению, экземпляр объекта включает вызовы его конструктора. Вы уверены, что не хотите писать более легкие конструкторы? (И нет, я не думаю, что есть другой способ.)
Есть ли еще […] способ сделать это?
Нет. По крайней мере, не переопределяя кодовую базу класса, используя расширения, такие как runkit .
В PHP Reflection нет функции, которая позволит вам создать экземпляр нового объекта без вызова конструктора.
менее хакерский путь
Это, безусловно, невозможно по двум причинам:
Все остальное будет означать больше работы, большей реализации и большего количества кода – поэтому, скорее всего, более хаки в ваших словах.