将两个对象合并为一个PHP对象
我发现了一种非常聪明的方法。但我只使用了一次,所以我不记得在哪里找到了真正的片段 我有一门课叫将两个对象合并为一个PHP对象,php,symfony,session,Php,Symfony,Session,我发现了一种非常聪明的方法。但我只使用了一次,所以我不记得在哪里找到了真正的片段 我有一门课叫 Worksheet { private $settings ... funnction GetSettings (){} ... } 此类具有方法、私有属性,并且可以从现有类扩展。在运行时,我从类“processit”创建一个对象,并将其保存在会话中,以便访问者可以在会话中使用它。每次请求时,我都必须从会话获取对象并将其反馈给处理器,以便更新对象属性(通常由多维数组组
Worksheet {
private $settings
...
funnction GetSettings (){}
...
}
此类具有方法、私有属性,并且可以从现有类扩展。在运行时,我从类“processit”创建一个对象,并将其保存在会话中,以便访问者可以在会话中使用它。每次请求时,我都必须从会话获取对象并将其反馈给处理器,以便更新对象属性(通常由多维数组组成)
我的Processor类中有一个简单的方法,用于创建原始原型并将会话对象装载到原型
class Processor {
public function Mount ($worksheetObject){
$this->NewWorksheetPrototype (); //Recreate worksheet from prototype.
require ('includes/mount.php'); //This will go through the provided Object and mount it on to the processor.
}
}
当然,我不想遍历整个对象,重新创建可能包含大量多维数组的属性。有可靠的方法可以做到这一点吗?我知道我能做到
$obj_merge=(对象)数组_merge((数组)$obj1,(数组)$obj2)
…但这些方法不会合并
无法在附加了方法的会话中保存对象?如果这有帮助,我将在Symfony2环境中工作。如果您使用的是PHP 5.4或更高版本,您可以尝试以下内容:
trait MergeableTrait{
protected $mergedObject;
public function merge($object2){
$this->mergedObject;
}
public function __get($name){
if(property_exists($this->mergedObject, $name)){
return $this->mergedObject->{'$name'}; //Pretty sure that's how it works.....
}
throw new RuntimeException("{$name} is not an available property");
}
public function __call($name, $arguments){
if(method_exists($this->mergedObject, $name)){
return call_user_func_array([$this->mergedObject, $name], $arguments);
}
throw new RuntimeException("{$name} is not a callable method");
}
}
$ws = new Worksheet();
$proc = new Processor();
$ws->merge($proc);
我还没有测试过它,但它应该会让你对如何做到这一点有一个好的想法。如果您的具体类没有定义\uu调用
或\uu获取
方法,您可以添加如下合并行为:
class Worksheet{
use MergeableTrait;
...
}
…或任何你需要的地方
然后你可以这样做:
trait MergeableTrait{
protected $mergedObject;
public function merge($object2){
$this->mergedObject;
}
public function __get($name){
if(property_exists($this->mergedObject, $name)){
return $this->mergedObject->{'$name'}; //Pretty sure that's how it works.....
}
throw new RuntimeException("{$name} is not an available property");
}
public function __call($name, $arguments){
if(method_exists($this->mergedObject, $name)){
return call_user_func_array([$this->mergedObject, $name], $arguments);
}
throw new RuntimeException("{$name} is not a callable method");
}
}
$ws = new Worksheet();
$proc = new Processor();
$ws->merge($proc);
这没有经过测试,我也不建议这样做,因为这样会使调试更加困难
还要记住,这不会考虑方法和属性的可见性。我可能会建议扩大检查范围,以包括一些基本的反映,但总的来说,这应该给您一个领先的开始