要恢复已持久化的对象的状态,我想在不调用其构造函数的情况下创建该类的空实例,以便稍后使用Reflection设置属性。
我找到的唯一方法,就是Doctrine的方式,就是创建对象的假序列化,并unserialize()
:
function prototype($class)
{
$serialized = sprintf('O:%u:"%s":0:{}', strlen($class), $class);
return unserialize($serialized);
}
还有另外一种 hacky 方法吗?
我期待在反思中找到这样的方式,但我没有。
答案 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中没有允许您在不调用构造函数的情况下实例化新对象的函数。
不那么黑客的方式
由于两个原因,这肯定是不可能的:
其他一切意味着更多的工作,更多的实施和更多的代码 - 所以你的话语中可能更多的是hacky。
答案 4 :(得分:0)
Doctrine为此提供了一个软件包,您可以使用:https://github.com/doctrine/instantiator