PHP MVC设计问题
我正在尝试使用OOP 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
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;
}
}