PHP-可继承复制方法

PHP-可继承复制方法,php,function,oop,inheritance,copy,Php,Function,Oop,Inheritance,Copy,以下是我的情况: 我有一个被十几个其他人继承的类,在这个类中我有一个copy方法,它返回自身的副本 我可以在继承类中使用此方法,但显然,该方法总是返回超类的实例,而不是从超类继承的实例 我希望我的copy方法返回ihneriting类的实例。 BaseEntity.php: User.php: 我认为有两种方法可以做到这一点: 使用clone-它将创建对象的浅拷贝 使用static创建新对象 <?php class BaseEntity { public function co

以下是我的情况:
我有一个被十几个其他人继承的类,在这个类中我有一个copy方法,它返回自身的副本
我可以在继承类中使用此方法,但显然,该方法总是返回超类的实例,而不是从超类继承的实例

我希望我的copy方法返回ihneriting类的实例。

BaseEntity.php:

User.php:


我认为有两种方法可以做到这一点:

  • 使用
    clone
    -它将创建对象的浅拷贝
  • 使用
    static
    创建新对象

    <?php
    
    class BaseEntity {
        public function copy() {
            return new static;
        }
    }
    
    class User extends BaseEntity {
    
    }
    
    $user = new User;
    var_dump($user->copy());
    

    我看到了两种方法:

  • 使用
    clone
    -它将创建对象的浅拷贝
  • 使用
    static
    创建新对象

    <?php
    
    class BaseEntity {
        public function copy() {
            return new static;
        }
    }
    
    class User extends BaseEntity {
    
    }
    
    $user = new User;
    var_dump($user->copy());
    

    实现您所需的另一种方法:

    <?php
    class BaseEntity
    {
        protected $id;
    
        public function copy()
        {
            $classname = get_class($this);
            $copy = new $classname;
    
            return $copy;
        }
    }
    class Test extends BaseEntity
    {
    
    }
    
    $test = new Test;
    $item = $test->copy();
    var_dump($item); // object(Test)
    

    实现您所需的另一种方法:

    <?php
    class BaseEntity
    {
        protected $id;
    
        public function copy()
        {
            $classname = get_class($this);
            $copy = new $classname;
    
            return $copy;
        }
    }
    class Test extends BaseEntity
    {
    
    }
    
    $test = new Test;
    $item = $test->copy();
    var_dump($item); // object(Test)
    

    为什么不使用
    clone
    ?然后需要继承
    User
    类中的copy()方法,并在其中添加逻辑。
    $copy=new get_class($this)
    尝试使用此方法,而不是
    $copy=new BaseEntity()
    为什么不使用
    clone
    ?然后需要继承
    User
    类中的copy()方法,并在其中添加逻辑。
    $copy=new get_class($this)
    尝试此方法,而不是
    $copy=new BaseEntity()
    你能告诉我更多关于这个
    返回新的static
    ?TL;DR Late static binding-PHP文档对此描述得很好:)我不知道如何使用
    返回新static
    来创建副本,因为它只是返回调用该副本的类的新实例。
    新static
    不会创建完整副本。它只允许您创建从中调用context
    copy()
    的类的新实例。其他用户发布了解决方案,如
    newget\u类($this)这是一个更奇特的解决方案。要进行复制,请使用
    clone
    。请记住,它将进行浅复制-这意味着分配给属性的对象将通过引用进行复制。好的,这就是我所理解的。谢谢你的帮助。你能告诉我更多关于这个
    returnnewstatic
    ?TL;DR Late static binding-PHP文档对此描述得很好:)我不知道如何使用
    返回新static
    来创建副本,因为它只是返回调用该副本的类的新实例。
    新static
    不会创建完整副本。它只允许您创建从中调用context
    copy()
    的类的新实例。其他用户发布了解决方案,如
    newget\u类($this)这是一个更奇特的解决方案。要进行复制,请使用
    clone
    。请记住,它将进行浅复制-这意味着分配给属性的对象将通过引用进行复制。好的,这就是我所理解的。谢谢你的帮助。最终在我的情况下,我宁愿使用这个而不是_clone()重载。最终在我的情况下,我宁愿使用这个而不是_clone()重载。