Создавать объект без вызова его конструктора в PHP

Чтобы восстановить состояние объекта, который был сохранен, я хотел бы создать пустой экземпляр класса без вызова его конструктора, чтобы позже установить свойства с помощью 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 нет функции, которая позволит вам создать экземпляр нового объекта без вызова конструктора.

менее хакерский путь

Это, безусловно, невозможно по двум причинам:

  1. Объекты либо сериализуются, либо нет.
  2. serialize / unserialize является самой естественной реализацией PHP настойчивости объекта вокруг

Все остальное будет означать больше работы, большей реализации и большего количества кода – поэтому, скорее всего, более хаки в ваших словах.