Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对对象的PHP类属性引用_Php_Oop - Fatal编程技术网

对对象的PHP类属性引用

对对象的PHP类属性引用,php,oop,Php,Oop,我得到的错误消息是调用非对象上的成员函数hi$obj应该引用类Hello的一个实例,但显然不是——我做错了什么 您正在测试类中定义_构造,但没有调用父构造函数。如果希望父构造函数执行,则需要显式指定。在测试类构造函数中添加对父类构造函数的调用 class Hello { public function hi() { echo "Hello, hi!\n"; } } class ParentClass { public $obj; public f

我得到的错误消息是调用非对象上的成员函数hi$obj应该引用类Hello的一个实例,但显然不是——我做错了什么

您正在测试类中定义_构造,但没有调用父构造函数。如果希望父构造函数执行,则需要显式指定。在测试类构造函数中添加对父类构造函数的调用

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();
    }
}