Создание объекта без вызова его конструктора в PHP - PullRequest
18 голосов
/ 04 августа 2011

Чтобы восстановить состояние объекта, который был сохранен, я хотел бы создать пустой экземпляр класса без вызова его конструктора, чтобы позже установить свойства с помощью Отражение .

Единственный способ, который я нашел, как это делает Doctrine , - создать поддельную сериализацию объекта и unserialize() it:

function prototype($class)
{
    $serialized = sprintf('O:%u:"%s":0:{}', strlen($class), $class);
    return unserialize($serialized);
}

Есть ли другой, менее хакерский способ сделать это?

Я ожидал найти такой способ в Reflection, но не нашел.

Ответы [ 4 ]

14 голосов
/ 07 сентября 2011

Обновление: ReflectionClass :: newInstanceWithoutConstructor доступно с версии PHP 5.4!

7 голосов
/ 04 августа 2011

Другим способом будет создание дочернего элемента этого класса с пустым конструктором

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
3 голосов
/ 04 августа 2011

По определению, создание объекта включает в себя вызов его конструктора.Вы уверены, что не хотите писать более легкие конструкторы?(И нет, я не думаю, что есть другой способ.)

1 голос
/ 04 августа 2011

Есть ли другой [...] способ сделать это?

Нет. По крайней мере, без переопределения кодовой базы класса с помощью расширений вроде runkit .

В PHP Reflection нет функции, которая позволила бы вам создать новый объект без вызова конструктора.

* * 1010

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

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

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

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

...