Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将PHP对象复制到不同的对象类型_Php_Oop - Fatal编程技术网

如何将PHP对象复制到不同的对象类型

如何将PHP对象复制到不同的对象类型,php,oop,Php,Oop,新类是原始对象的子类 它需要与php4兼容 我想你会发明某种“复制构造函数”。然后,您只需在传递原始对象的同时创建一个新的子类对象。最好的方法是在子类上创建一个克隆方法,以便您可以执行以下操作: $myvar = $subclass->clone($originalObject) 或者,听起来您可以查看decorator模式,您可以将类实例化为空,然后由任意数量的方法加载。其中一个方法可以接受父类的实例作为参数,然后从中复制其数据 class childClass extends par

新类是原始对象的子类

  • 它需要与php4兼容


  • 我想你会发明某种“复制构造函数”。然后,您只需在传递原始对象的同时创建一个新的子类对象。

    最好的方法是在子类上创建一个克隆方法,以便您可以执行以下操作:

    $myvar = $subclass->clone($originalObject)
    

    或者,听起来您可以查看decorator模式,您可以将类实例化为空,然后由任意数量的方法加载。其中一个方法可以接受父类的实例作为参数,然后从中复制其数据

    class childClass extends parentClass
    {
        function childClass()
        {
            //do nothing
        }
    
        function loadFromParentObj( $parentObj )
        {
            $this->a = $parentObj->a;
            $this->b = $parentObj->b;
            $this->c = $parentObj->c;
        }
    };
    
    $myParent = new parentClass();
    $myChild = new childClass();
    $myChild->loadFromParentObj( $myParent );
    

    php对象与数组没有太大区别,因为所有php 4对象变量都是公共的,所以您可以做一些像这样的事情:

    function clone($object, $class)
    {
         $new = new $class();
         foreach ($object as $key => $value)
         {
              $new->$key = $value;
         }
         return $new;
    }
    $mySubclassObject = clone($myObject, 'mySubclass');
    

    它不漂亮,它的本质不是我认为是好的实践,但它是可重用的,它是相当整洁的。

    你可以用一些黑魔法来做,虽然我会严肃地质疑<强>为什么你首先有这个要求。这表明您的设计存在严重错误

    尽管如此:

    function change_class($object, $new_class) {
      preg_match('~^O:[0-9]+:"[^"]+":(.+)$~', serialize($object), $matches);
      return unserialize(sprintf('O:%s:"%s":%s', strlen($new_class), $new_class, $matches[1]));
    }
    

    这与serialize通常受到相同的限制,这意味着对其他对象或资源的引用将丢失。

    这是我目前的解决方案。我想我不能指望有其他魔法能做到这一点。