3

我正在使用基本的 MVC 进行练习,但出现此错误:

Fatal error: Call to a member function run() on a non-object in Router.php on line 5

我究竟做错了什么?

核:

<?php

class Core {
    protected $router;
    protected $controller;

    public function run() {
        $this->router =& load_class('Router');
        $this->controller =& load_class('Controller');

        $this->router->run();
    }
}

路由器:

class Router extends Core {
    public function run() {
        echo $this->controller->run();
    }
}

控制器:

class Controller extends Core {
    public function run() {
        return 'controller';
    }
}

哦,还有 load_class 函数

function &load_class($class_name) {
    $path = ROOT . 'system/classes/' . $class_name . '.php';

    if (file_exists($path)) {
        include_once($path);

        if (class_exists($class_name)) {
            $instance = new $class_name;
            return $instance;
        }
    }

    return false;
}

提前非常感谢。

4

2 回答 2

2

如果您扩展扩展以查看它的实际外观,您将了解它失败的原因:

class Core {
    protected $router;
    protected $controller;

    public function run() {
        $this->router =& load_class('Router');
        $this->controller =& load_class('Controller');

        $this->router->run();
    }
}

结束:

class Router extends Core {
    public function run() {

        echo $this->controller->run();
    }
}

这与以下内容大致相同:

class Router {
    protected $router;
    protected $controller;   // <- this is "$this->controller"

    public function run() {

        echo $this->controller->run();
    }
}

如您所见, $this->controller 是一个变量,因此没有方法

因此,在扩展版本中,您需要使用 parent::$controller->run(); 来引用父类。

于 2013-04-30T18:32:20.580 回答
0

我可能在这里偏离了基础,但是通过扩展Core这些类中的每一个,我认为您无意中覆盖了该run()方法并混淆了每个类的范围。您是否尝试过从run()单独的非扩展类调用?

于 2013-04-30T16:51:56.903 回答