实例化对象而不在 PHP 中调用其构造函数

2022-08-30 21:02:13

为了恢复已持久化的对象的状态,我想创建该类的一个空实例,而不调用其构造函数,以便以后使用Reflectle设置属性。

我发现的唯一方法,也就是教条的方式,就是创建对象的假序列化,并把它序列化:unserialize()

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

有没有另一种不那么笨拙的方法可以做到这一点?

我本来以为能在《反思》中找到这样一种方式,但我没有。


答案 1

更新:ReflectionClass::newInstanceWithoutConstructor 自 PHP 5.4 起可用!


答案 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 = new Child();
//set properties with reflection for child and use it as a Parent type

推荐