对对象的PHP类属性引用
我得到的错误消息是调用非对象上的成员函数hi$obj应该引用类Hello的一个实例,但显然不是——我做错了什么 您正在测试类中定义_构造,但没有调用父构造函数。如果希望父构造函数执行,则需要显式指定。在测试类构造函数中添加对父类构造函数的调用对对象的PHP类属性引用,php,oop,Php,Oop,我得到的错误消息是调用非对象上的成员函数hi$obj应该引用类Hello的一个实例,但显然不是——我做错了什么 您正在测试类中定义_构造,但没有调用父构造函数。如果希望父构造函数执行,则需要显式指定。在测试类构造函数中添加对父类构造函数的调用 class Hello { public function hi() { echo "Hello, hi!\n"; } } class ParentClass { public $obj; public f
class Hello {
public function hi() {
echo "Hello, hi!\n";
}
}
class ParentClass {
public $obj;
public function __construct() {
$this->obj = new Hello;
}
}
class Test extends ParentClass {
public function __construct() {
$this->obj->hi();
}
}
$temp = new Test;
正如@Tasos Bitsios在他的评论中指出的,您还需要更新父类构造函数,如下所示:
class Test extends ParentClass {
public function __construct() {
parent::__construct();
$this->obj->hi();
}
}
您需要调用父构造函数:
class ParentClass {
public $obj;
public function __construct() {
$this->obj = new Hello; // Use $this->obj and not just $obj.
}
}
$obj!=$this->obj我只是在复制代码时忘记了$this。我不确定,但可能父类构造函数没有自动调用,而且:在父类构造函数中:$this->obj=而不是$obj=谢谢,我明白了。当我必须显式调用构造函数时,有规则吗?@TasosBitsios,谢谢你指出这一点。我在答案中加了这个。注意:如果子类定义构造函数,则不会隐式调用父构造函数。为了运行父构造函数,需要在子构造函数中调用parent::\u构造函数。如果子类没有定义构造函数,那么它可能会像未声明为私有的普通类方法一样从父类继承。编辑:链接
class Test extends ParentClass {
public function __construct() {
parent::__construct();
$this->obj->hi();
}
}