将两个对象合并为一个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);
这没有经过测试,我也不建议这样做,因为这样会使调试更加困难

还要记住,这不会考虑方法和属性的可见性。我可能会建议扩大检查范围,以包括一些基本的反映,但总的来说,这应该给您一个领先的开始