需要帮助理解php对象的各个方面

时间:2011-05-19 14:21:11

标签: php class object

我是php的新手,需要一些帮助才能理解我无法获得的php对象的各个方面。在类a中,我创建了扩展a的类b和c,但我想要做的是从类c中获取类a中的公共字母变量,因此可以从类c获得函数testb()。

任何帮助都非常感谢人们

   <?php

    class a {
        public $letters;
        function __construct() {
            $this->letters->b = new b();
            $this->letters->c = new c();
        }
    }   

    class b extends a {
        function __construct() {
            echo "hello world from b ";
        }

        private function testb() {
            echo "testing from b";
        }
    }

    class c extends a {
        function __construct() {
            echo "hello world from c ";
            $this->letters->b->testb();
        }
    }


    $a = new a();

?>

以下脚本回应了我们的“hello world from b”和“hello world from c”但它没有打印出“b测试”...

5 个答案:

答案 0 :(得分:2)

PHP对象的缺陷是继承被捏造(只是一点点)。当您实例化其中一个子对象时,不会隐式调用父对象的构造函数。相反,您必须显式调用父对象的构造函数。

class b extends a {
...
    public __construct() {
        parent::__construct();
        echo("Hello From B!");
    }
...
}

在您的类c构造函数中,$this->letters不是对象,并且由于尚未调用a构造函数而尚未初始化。

如果你只是玩弄物体,那么忽略这部分,但你接近于获得一个循环的层次结构。如果您添加我建议的更改,我相信如果您尝试直接实例化B或C对象,您的代码将会爆炸。

答案 1 :(得分:0)

您无法在班级testb内拨打c的原因是testb的方法签名将其声明为private - 这意味着它只能被访问在b个实例中。将可见性更改为默认值(无修饰符)或public

E.g:

function testb() {
    echo "testing from b";
}

或者:

public function testb() {
    echo "testing from b";
}

编辑:

问题是你没有从c的构造函数中调用超级构造函数 - 因此$this->b的值未初始化。将c的构造函数更改为:

function __construct() {
    parent::__construct();
    echo "hello world from c ";
    $this->letters->b->testb();
}

不幸的是,这将创建一个无限循环,其中a的构造函数正在实例化c并且c的构造函数正在调用a的构造函数。为什么你的信函课程甚至相互延伸?

您还需要更改testb类中b的可见性。

答案 2 :(得分:0)

好的,如果你从 b 扩展课程 c ,你可以调用该方法,否则不会因为你从课程a而不是从c ...扩展它。

答案 3 :(得分:0)

在您的班级a中,您正在构建班级c的新对象。

此新对象没有属性$this->letters->b,它只有一个未初始化的属性$this->letters

请注意,新对象从它扩展的类继承属性$letters,但它不会继承实例化a对象的任何值。因此,没有$this->letters->b,也没有函数$this->letters->b->testb()可以调用。

答案 4 :(得分:-1)

“c”扩展“a”并且不继承“b”方法

您的示例将返回

  

致命错误:调用成员函数   testb()在非对象上

代表

  

$这 - &GT; letters-&GT; B-&GT; TESTB();