我试图让下面的工作,但我不知所措......

class Foo {
    public $somethingelse;

    function __construct() {
        echo 'I am Foo';
    }
    function composition() {
        $this->somethingelse =& new SomethingElse();
    }
}
class Bar extends Foo {
    function __construct() {
        echo 'I am Bar, my parent is Foo';
    }
}
class SomethingElse {
    function __construct() {
        echo 'I am some other class';
    }
    function test() {
        echo 'I am a method in the SomethingElse class';
    }
}

我想要做的是类Foo内创建SomethingElse类的一个实例。此工程采用=&。但是,当我扩展类Foo带班吧,我以为孩子继承了所有数据的属性和方法从父类。然而,似乎$this->somethingelse不子类酒吧工作:

$foo = new Foo(); // I am Foo
$foo->composition(); // I am some other class
$foo->somethingelse->test(); // I am a method in the SomethingElse class

$bar = new Bar(); // I am Bar, my parent is Foo
$bar->somethingelse->test(); // Fatal error: Call to a member function test() on a non-object

因此,这不可能以这样的方式来继承?而应该从我Bar类中创建类SomethingElse的新实例,如果我想有使用它呢?还是我失去了一些东西?

在此先感谢您的帮助。

有帮助吗?

解决方案

  

我以为孩子继承所有从父类的数据属性和方法。

这是真的 - 子类从父类继承的静态变量和静态方法。此外,任何的子对象将继承的静态变量和实例变量和方法。

一种可能性,让你想与您现有的类结构,这是什么:

$bar = new Bar();
$bar->composition();// here you are calling the parent method, sets instance var $somethineelse
$bar->somethingelse->test();// now you can call methods

另一种方式来完成的继承变量(在此情况下的对象)在子实例是像这样:

class Foo {
    protected $somethingelse;
    public function __construct() {
        $this->somethingelse = new SomethingElse();
    }
}

class Bar extends Foo {
    public function __construct() {
        parent::__construct();
        // now i've got $somethingelse
    }
 }

有关类和对象的PHP 5的一个很好的概述,下面一起来看看: http://php.net/manual/en/language.oop5.php 请务必阅读这一切,也许几次,如果OO是新的给你。

其他提示

杆具有somethingelse命名一个成员变量,它是从foo的继承。

你混合对象和类范围。

如果你真的想达到的效果所描述的,你必须让你的静态变量,所以它的上下文是基于类

首先,你有静态和实例变量之间的区别。静态变量在类的所有实例之间共享,实例变量则不是。

如果你想Foo和Bar的每个实例有完全相同的SomethingElse,比如你必须做出$ somethingelse静态:

公共静态$ somethingelse

和你应该改变foo的组合物功能:

function composition() {
    self::$somethingelse = new SomethingElse();
}

要访问此静态字段,你可以做到以下几点: $富=新的Foo(); //我美孚 $ foo->组合物(); //我一些其他类 FOO:$ somethingelse->试验(); //我在SomethingElse类中的方法

$条=新栏(); //我吧,我的父母是富 酒吧:: $ somethingelse->测试(); //我在SomethingElse类中的方法

如果你想Foo和酒吧的每一个实例都可以使用你的代码自己SomethingElse实例,但你需要添加

$酒吧,>组合物()

之前$酒吧,> somethingelse->试验();

这是因为与

$条=新栏();

在创建酒吧的一个全新的实例,该实例有一个$ somethingelse属性,但它尚未设置。所以,你需要调用组成()来设置它。

如果每一个Foo和酒吧应该有相同的SomethingElse实例,你应该使用静态版本代替,因为它减少了所需的内存。

我希望这可以帮助你。否则,我很高兴能进一步解释一下。

话说类共享属性并不意味着该对象共享的属性值

正如其他人指出,你是混乱的类与实例。

请注意,你会得到同样的错误,如果你做的事:

$foo = new Foo(); // I am Foo
$foo->composition(); // I am some other class
$foo->somethingelse->test(); // I am a method in the SomethingElse class

$foo2 = new Foo(); // I another Foo
$foo2->somethingelse->test(); // Fatal error: Call to a member function test() on a non-object

把类少抽象。例如,你可能有一类,“人”,这是一个父类的“版税。”

然后,如果你做的事:

$我=新的Person();    我 - $>的firstName = “托马斯”

$ princeCharles =新版税();

您不想$ princeCharles有将firstname属性等于“托马斯”,如果你想设置$ princeCharles->名字,你不这样做,要改变的$中的firstName属性的值我

两者$我和$ princeCharles有一个属性“姓”,但我们不同意该属性的

我觉得你的问题将得到解决,如果在派生类的构造函数会调用父类的构造。这并不在默认情况下PHP出现这样记住它,当你有继承的数据成员的问题。

类酒吧延伸的Foo {     公共函数__construct(){         父:: __构建体();

}

}

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top