我正在尝试创建一个简单的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
。
答案 0 :(得分:6)
通过编写call_user_func(array("Child", $where), $this)
,您将静态调用该方法。但是由于你的方法不是静态的,你需要某种对象实例:
call_user_func(array(new Child, $where), $this);
答案 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
来访问它们。
这是使用信息吗?