我是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测试”...
答案 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();