2015-10-19 56 views
1

是否可以仅在PHP中克隆对象的父对象?我试过使用此代码,但它返回一个Fatal error: __clone method called on non-object错误消息。你可以在PHP中克隆一个对象的父对象吗?

这里是我的代码:

class A { 
    public $val1=1; 
    public $val2=2; 
} 

class B extends A { 
    public $val3=3; 

    public function getParent() { 
     return clone parent; 
    } 
} 

$B=new B(); 
$A=$B->getParent(); 

我inted使用这种方式,将以下内容:
我们建议我不得不类:TableRecord extends TableTable类包含有关MySQL数据库表的信息,它包含的字段,这些字段的默认值,主键,最重要的是它包含三种方法(插入,删除,更新),但我们只会讨论这里删除。这三个方法作为匿名函数存储在类中的受保护数组中。表类的删除方法告诉在从相应表中删除某些内容时要执行什么操作。

例如,我们有以下三种MySQL表:孩子孙子。这些表连接在一起以下列方式:在表中的记录可以在孩子被链接到多个记录表,而在孩子表可在孙子被链接到几个记录的记录表。

在这个例子中, MySQL表的 Table对象会告诉我们,当我们从这个表中,基于表的主键删除一条记录,我们应该从 删除所有记录

所以儿童表与此记录相关联。 子女的删除方法表中有类似的说法:当我们从表中删除一条记录时,我们应该从孙子表中删除每条记录,其中子女表刚刚被删除。

当我在我的代码中初始化对象时,我将只初始化Record extends Table对象。第一次,Table对象通过Record extends Table对象进行初始化,它应该存储在Table类的静态变量中,以供将来使用,因此从表中删除某些内容时,我不必创建新记录,我只是使用:Table::$tables['parent']->delete(5);这将删除主键为5的表中的记录,并删除需要删除的所有其他内容。

我不知道这是否有意义(它可以是非全面的,因为英语不是我的本地语言,或者因为它在地球的另一端相当晚,也许有一个更容易和更清洁解决我的问题,然后我想象的那个)

+2

这没有意义,因为'parent'不是一个对象,而是对父_class_的引用。类不能被克隆。 – arkascha

+0

'返回新父项;' – AbraCadaver

+0

@AbraCadaver哪一个几乎不会返回一个克隆? – arkascha

回答

1

不,你不能(在PHP中)。在这种情况下适当的方法是:

class B extends A { 
    public $val3=3; 

    public function toA() { 
     $a = new A(); 
     // Note: If $this->val is an object value you need to 
     // use $a->val = clone $this->val; 
     $a->val1 = $this->val1; 
     $a->val2 = $this->val2; 
     return $a; 
    } 
} 

但是,一个适当的OOP设计不应该要求这样的方法。编写处理A的零件可以简单地处理B,如A,因为BA延伸。我的意思是这是继承的基本思想之一。