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