实例化一个对象而不在PHP中调用它的构造函数

时间:2011-08-04 16:19:22

标签: php oop reflection instantiation

要恢复已持久化的对象的状态,我想在不调用其构造函数的情况下创建该类的空实例,以便稍后使用Reflection设置属性。

我找到的唯一方法,就是Doctrine的方式,就是创建对象的假序列化,并unserialize()

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

还有另外一种 hacky 方法吗?

我期待在反思中找到这样的方式,但我没有。

5 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:7)

另一种方法是使用和空构造函数

创建该类的子级
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

答案 2 :(得分:3)

根据定义,实例化对象包括调用其构造函数。你确定你不想写更多的轻量级构造函数吗? (不,我不认为还有另一种方式。)

答案 3 :(得分:1)

  

还有另一种方法吗?

没有。至少不能通过使用runkit等扩展来重新定义类的代码库。

PHP Reflection中没有允许您在不调用构造函数的情况下实例化新对象的函数。

  不那么黑客的方式

由于两个原因,这肯定是不可能的:

  1. 对象是否可序列化和
  2. serialize / unserialize是PHP最基本的对象持久性实现
  3. 其他一切意味着更多的工作,更多的实施和更多的代码 - 所以你的话语中可能更多的是hacky。

答案 4 :(得分:0)

Doctrine为此提供了一个软件包,您可以使用:https://github.com/doctrine/instantiator