如何将ClassBuilder的baseClass替换为同属性值的ChildClass实例?
如何在ClassBuilder中实现update方法替换为ChildClass实例并保留属性值?
你想要把ClassBuilder里的$baseClass从BaseClass实例替换成ChildClass实例,同时保留原对象的属性值对吧?这可以通过获取原对象的属性集合,再赋值给新的子类实例来实现,具体方案如下:
实现方案
我们可以利用PHP的get_object_vars()函数获取原BaseClass实例的所有可访问公共属性,接着创建新的ChildClass实例,将这些属性值逐一赋值过去,最后替换$baseClass属性即可。
修改后的update()方法代码如下:
public function update() { // 初始化ChildClass实例 $childInstance = new ChildClass(); // 获取原BaseClass实例的所有public属性键值对 $properties = get_object_vars($this->baseClass); // 循环将属性值赋值给新的子类实例 foreach ($properties as $key => $value) { $childInstance->$key = $value; } // 替换baseClass为新的ChildClass实例 $this->baseClass = $childInstance; }
测试验证
把这段代码加入你的ClassBuilder类后,可以通过以下代码验证效果:
$builder = new ClassBuilder(); $builder->set(); // 此时baseClass的foo属性为'bar' $builder->update(); // 验证实例类型和属性值 var_dump($builder->baseClass instanceof ChildClass); // 输出 bool(true) var_dump($builder->baseClass->foo); // 输出 string(3) "bar"
这个方案的优势在于,即便后续BaseClass新增更多公共属性,update()方法也能自动兼容,无需额外修改。如果之后需要处理protected或private属性,可以考虑使用PHP反射API来扩展实现。
内容的提问来源于stack exchange,提问作者Timothy Fisher
相关产品推荐
相关产品推荐

