使用$ this访问子级中的父级属性

时间:2011-06-15 20:59:34

标签: php oop

我正在尝试创建一个简单的MVC,我个人使用,我可以真正使用这个简单问题的答案

class theParent extends grandParent{

    protected $hello = "Hello World";

    public function __construct() {
        parent::__construct();
    }

    public function route_to($where) {
        call_user_func(array("Child", $where), $this);
    }
}

class Child extends theParent {

    public function  __construct() {
        parent::__construct();
    }

    public function index($var) {
        echo $this->hello;
    }

}

$x = new theParent();
$x->route_to('index');

现在Child::index()会抛出一个致命的错误:Using $this when not in object context但是如果我使用echo $var->hello,它就可以了。

我知道我可以使用$var来访问父级中的所有属性,但我宁愿使用$this

3 个答案:

答案 0 :(得分:6)

通过编写call_user_func(array("Child", $where), $this),您将静态调用该方法。但是由于你的方法不是静态的,你需要某种对象实例:

call_user_func(array(new Child, $where), $this);

Documentation on callback functions

答案 1 :(得分:4)

你没有Child的实例在你做$x->route_to('index');时调用非静态方法你调用方法的方式,没有先做实例,暗示是静态的。

有两种方法可以纠正它。要么Child类的方法是静态的:

class Child extends theParent {

    public function  __construct() {
        parent::__construct();
    }

    static public function index($var) {
        echo self::$hello;
    }

}

...或者为父级创建子类的实例:

   class theParent extends grandParent{

        protected $hello = "Hello World";
        private $child = false

        public function __construct() {
            parent::__construct();
        }

        public function route_to($where) {
            if ($this->child == false)
              $this->child = new Child();
            call_user_func(array($this->child, $where), $this);
        }
    }

当然,这两个样本都非常通用且毫无用处,但你可以看到这个概念。

答案 2 :(得分:1)

$this使您可以访问当前对象中可见/可访问的所有内容。这可以是班级本身(本)或其中任何一方的父母公共或受保护的成员/职能。

如果当前类覆盖了父类的某些内容,您可以使用parent关键字/标签显式访问父方法,而无需向其添加::,无论它是否为静态方法

受保护的变量只存在一次,因此您无法使用parent来访问它们。

这是使用信息吗?