2014-11-06 107 views
1

我不是很好,但在PHP语法,所以这里是我的问题:PHP的子类构造函数调用父对象作为参数

我有一个类Foo。

Class Bar延伸Foo。

我想为Bar创建一个构造函数,并将其作为类Foo的一个实例作为参数调用,并创建一个Bar实例,该实例看起来就像Foo类的实例。

看来我必须这样做,因为Foo是WordPress插件中的一个类。我正在编写一个插件来放在原始插件的顶部,并且在我可以添加的过滤器中,我得到了Foo对象。

如果我可以学习“正确”的方法来做到这一点,我就会以“正确”的方式做到这一点。

这样:

class Foo {  // in the original plugin 
    public function __construct() { 
     <do some stuff> 
    } 
} 

class Bar extends Foo {  // in my plugin to extend the original plugin 
    public function __construct($myFooObject) { 
     <I want: $this = $myFooObject; but it doesnt work> 
     <do some stuff special to Bar> 
    } 
} 
+0

bar正在扩展foo,所以它已经成为foo的一个实例。它恰好在顶部叠加了额外的条形码。 – 2014-11-06 19:07:38

+0

我不知道我明白你想做什么,但你可能想看看[parent ::](http://php.net/manual/en/keyword.parent.php)。马克所说的绝对是正确的。 – vcanales 2014-11-06 19:10:12

+0

这本PHP手册有一个真正简单的概述,你正在问什么。这是一个链接到它的文档 - http://php.net/manual/en/language.oop5.decon.php – 2014-11-06 19:10:24

回答

0
<?php 

class Bar extends Foo { // in my plugin to extend the original plugin 
    public function __construct($myFooObject) { 
    foreach (get_object_vars($myFooObject) as $key=>$value){ 
     $this->$key = $value; 
    } 

    // <I want: $this = $myFooObject; but it doesnt work> 
    // <do some stuff special to Bar> 
    } 
} 

这不仅会为Foo性实例,但在创建复制$myFooObject属性。

+0

谢谢,就是这样。 – Amber 2014-11-07 04:22:53

1

嘛。您已经继承了Foo类的功能和成员。你在这里错过的是调用父类的构造函数(Foo的构造函数)。

以下行添加到您的酒吧的__construct()

parent::__constrcut(); 

酒吧现在看起来是这样的:

class Bar extends Foo {  // in my plugin to extend the original plugin 
    public function __construct($myFooObject) { 
     parent::__construct(); // we've added this line to call the parent constructor 
     <do some stuff special to Bar> 
    } 
} 

在调用子类的构造父类的构造使你的对象的完整性,并允许该子类可以动态访问其父项。

+0

我同意这是最好的选择。但是,当基类对象在库中构造时,这不是一个解决方案。 – 2014-11-24 11:05:40

相关问题