Ответ 1
Обновление: ReflectionClass:: newInstanceWithoutConstructor доступен с PHP 5.4!
Чтобы восстановить состояние объекта, который был сохранен, я хотел бы создать пустой экземпляр класса без вызова его конструктора, чтобы позже установить свойства с помощью Reflection.
Единственный способ, который я нашел, это способ Doctrine, заключается в создании поддельной сериализации объекта и в unserialize()
it:
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 нет функции, которая позволит вам создать экземпляр нового объекта без вызова конструктора.
менее хакерский путь
Это, безусловно, невозможно по двум причинам:
Все остальное будет означать больше работы, большей реализации и большего количества кода - поэтому, скорее всего, более хаки в ваших словах.