PHP MVC设计问题

PHP MVC设计问题,php,undefined,Php,Undefined,我正在尝试使用OOP PHP构建MVC模式。请阅读这篇文章的其余部分,了解我到底想要什么 这是扩展主控制器的主页控制器 class Home extends Controller { function __construct () { parent::__construct(); } public function index () { $this->load->model("test"); $this-&g

我正在尝试使用OOP PHP构建MVC模式。请阅读这篇文章的其余部分,了解我到底想要什么

这是扩展主控制器的主页控制器

class Home extends Controller {

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

    public function index () {
        $this->load->model("test");
        $this->test->get_all();
        $data = array (
            'name' => "Amr",
            'age' =>24
        );
        $this->load->view("home_view",$data);
    }

}
主控制器如下所示,并扩展加载程序类:

class Controller extends Loader {
    public $load;

    function __construct(){
        parent::__construct();
        $this->load = new Loader();
    }
}
出现问题的Loader类如下所示

class Loader {

    public $Error;

    function __construct(){
        $this->Error = new Error();
    }

    public function model($Modelname){
        $this->$Modelname = $Modelname;
        if (file_exists("models/".$Modelname.".php")){
            require_once $Modelname . ".php";
            $this->$Modelname = new $Modelname;
        }else{
            $this->Error->Not_found();
        }
    }

    public function view($Viewname,$data=NULL){
        if(is_array($data)){
            extract($data);
        }
        if (file_exists("views/".$Viewname.".php")){
            require_once $Viewname . ".php";
        }else{
            $this->Error->Not_found();
        }
    }

    public function helper($helper) {
        if (file_exists("helpers/".$helper.".php")){
            require_once $helper . ".php";
            $this->$helper = new $helper;
        }else{
            $this->Error->Not_found();
        }
    }

}
我需要做的是能够从HOMEPAGE Controller执行以下操作:

$this->load->model("someModel"); // model name is test
$this->someModel->someMethodInModel(); // the model method is get_all()
// and the same for helper
$this->load->helper("someHelper");
$this->someHelper->someMethodInHelper();
有人能帮我吗

EDIT:执行此操作时出现的错误是:

注意:未定义的属性:Home::$test

致命错误:对非对象调用成员函数get_all()

注:模型名称为
test
,模型方法为
get_all()

你需要什么帮助?使用当前代码,您可以执行以下操作

$this->load->model("someModel");
$this->someModel->someMethodInModel();
// and the same for helper
$this->load->helper("someHelper");
$this->someHelper->someMethodInHelper();

在您的家庭控制器中。我只是自己试了一下。你会犯什么错误?什么工作不正常?

如果我是你,我会在我的控制器中放入一个“load()”方法,该方法将调用“loader”类,并将新的模型/助手/视图存储到一个变量中。

我想你遇到的问题是,你的加载器创建一个模型实例作为
加载器
类的成员,而不是您的控制器类。

如果您的基本控制器扩展了加载器,那么就没有理由像属性一样使用它

class Controller extends Loader {
    public $load;

    function __construct(){
        parent::__construct();
        $this->load = new Loader();
    }
}
换成

class Controller extends Loader {

}
另一种方法是使用魔术钩


我在帖子上做了编辑,John,这就是我得到的,非常感谢您的时间,希望您能帮助我编辑代码当前代码是我使用的,除了在home controllerIt的索引方法中添加了两行之外。这是一个范围问题,也是面向对象编程的基础之一。您的
Loader
类正在实例化一个模型,并将其添加为该类的成员,而不是您的控制器类调用您的
load()
方法。因此,要从控制器访问模型,需要执行类似于
$this->load->someModel->someMethodInModel()的操作取而代之。
class Controller extends Loader {

}
class Controller {
    public $load;

    function __construct(){
        parent::__construct();
        $this->load = new Loader();
    }

    function __get($modelName){
       return $this->load->$modelName;
    }


}