Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 2

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

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

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

Ответ 4

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

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

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

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

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

  • Объекты либо сериализуются, либо нет, и
  • serialize/unserialize - это самая распространенная реализация персистентности PHP вокруг

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