【问题标题】:How do you copy a PHP object into a different object type如何将 PHP 对象复制到不同的对象类型中
【发布时间】:2010-09-12 06:25:41
【问题描述】:
  1. 新类是原始对象的子类

  2. 需要兼容php4

【问题讨论】:

    标签: php oop


    【解决方案1】:

    你可以用一些黑魔法来做到这一点,尽管我会认真地质疑为什么你首先有这个要求。这表明您的设计存在严重问题。

    尽管如此:

    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]));
    }
    

    这受到与一般序列化相同的限制,这意味着对其他对象或资源的引用会丢失。

    【讨论】:

      【解决方案2】:

      php 对象与数组并没有太大的不同,而且由于所有 PHP 4 对象变量都是公共的,因此您可以做一些像这样的杂乱无章的事情:

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

      它并不漂亮,而且它肯定不是我认为是好的做法,但它可重复使用的,而且非常整洁。

      【讨论】:

        【解决方案3】:

        您可以将您的类实例化为空,然后通过任意数量的方法加载。其中一种方法可以接受父类的实例作为参数,然后从那里复制其数据

        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 );
        

        【讨论】:

        • 这是我目前的解决方案。我想我不能指望任何其他魔法来做到这一点。
        【解决方案4】:

        最好的方法是在子类上创建一个克隆方法,以便您可以这样做:

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

        另外,听起来您可以查看装饰器模式php example

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-22
            • 1970-01-01
            • 1970-01-01
            • 2020-07-07
            • 2018-02-10
            • 2017-02-02
            相关资源
            最近更新 更多