使用MVC模式(OOP编程的新功能)处理PHP框架存在问题
在我开始让你们知道我是OOP编程新手之前,请放松点 我目前正在开发一个PHP框架,我能够通过一个入口点来路由我的流量。这是下面的结构使用MVC模式(OOP编程的新功能)处理PHP框架存在问题,php,frameworks,Php,Frameworks,在我开始让你们知道我是OOP编程新手之前,请放松点 我目前正在开发一个PHP框架,我能够通过一个入口点来路由我的流量。这是下面的结构 index-->bootstrap-->router-->controller 这是主控制器 class controller { protected $_model; protected $_controller; protected $_id; protected $_view; function __construct($controller,$mode
index-->bootstrap-->router-->controller
这是主控制器
class controller {
protected $_model;
protected $_controller;
protected $_id;
protected $_view;
function __construct($controller,$model,$view,$id=NULL) {
$this->_controller = $controller;
$this->_id = $id;
$this->_model = $model;
$this->_view = $view;
$this->$model = new $model;
$this->_view = new view;
}
function filter($data) {
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data = mysql_real_escape_string($data);
return $data;
}
function set($name,$value) {
$this->_view->set($name,$value);
}
function __destruct(){
$this->_view->render();
}
}
在我的构造函数中,假设设置
$this->$model=新的$model
和$this->\u视图=新视图代码>
但是当我运行$this->\u view->render()时
或$gamerequests\u array=$this->main\u model->tab\u query($tab)代码>
它说这个物体不存在。这是我得到的确切错误信息
注意:未定义的属性:main\u控制器::$main\u model
和
致命错误:调用非对象上的成员函数tab_query()
因此,在这一点上,我知道问题在于设置新对象的框架。我一直在想办法,现在我需要一些帮助
如果有人需要额外的代码,请随意请求,我会发布它。从这一行:
$this->$model = new $model;
它显示您传入一个字符串并将其用作属性名和类名。可能您传入的名称不完全是main\u model
。虽然变量/属性名区分大小写,但类名不区分大小写。因此,它们可能是不匹配的。将$this
传递到get\u object\u vars
以查看哪些属性可用。请记住,以这种方式动态添加属性将使它们公开
还应检查这些线路:
$this->_view = $view;
$this->_view = new view;
您正在覆盖该属性。我相信这是无意的,可能是您遇到的问题的一部分。也许您正试图使用与控制器相同的方法(存储名称,用于实例化和访问)
只有当$model的值恰好也是已设置的属性时,这才可能起作用。这意味着它只能包含值“\u controller”、“\u id”、“\u model”和“\u view”,否则它将抛出一个错误(注意:未定义的属性:main\u controller::$main\u model和致命错误:调用非对象上的成员函数tab\u query())-即使它有这些值之一,它仍将覆盖您将属性设置为的任何内容
如果试图将视图动态设置为某个对象,则可能希望将$view
作为参数传递到视图构造函数中:
$this->_view = new view($view);
您可以通过继承为$view
的不同值设置不同的行为来进一步扩展此功能,通过带有返回适当对象的case开关的全局函数或视图类的方法进行继承。您正在覆盖$this->\u view
和$this->$model
也无法工作,因为它是一个对象。你可以使用一个现有的框架,而不是滚动你自己的框架。我在自学如何构建框架,这不像我在试图及时完成某件事。你是对的,我覆盖属性是我试图修复的结果。数组(5){[“\u model”]=>string(10)“main\u model”[“\u controller”]=>string(15)“main_controller”[“_id”]=>NULL[“_view”]=>object(view){[“variables:protected”]=>array(0){}[“main_model”]=>object(main_model){[“_model:protected”]=>string(10)“main_model”[“_dbHandle:protected”=>bool(false)[“_result:protected”]>NULL}我做得怎么样?我看到了main\u model
对象。您试图在哪里以及如何访问它?下面是我调用该对象的方式-->$gamerequests\u array=$this->>model->tab\u query($tab);
调用非对象上的成员函数tab\u query()
应该做的:$this->main\u model->->tab query($tab)
而不是$this->\u model
\u model
只是一个字符串。如果要使用该字符串调用它,可以执行以下操作:$this->{$this->\u model}->tab\u查询($tab)
好的,在这一点上,我把$this->$model=new$model;
改成了$this->\u model=new$model;
,它似乎在工作,唯一的问题是我调用这个对象时遇到了麻烦。下面是我如何调用它-->$gamerequests\u array=$this->\u model->tab\u query($tab)
下面是错误--->调用非对象上的成员函数tab\u query()
。请尝试`$gamerequests\u array=new controller($controller,$model,$view,$id=NULL);`-后跟`$gamerequests\u array->\u model->tab\u query($tab)“`。我假设$gamerequests_数组是运行脚本的一部分,而不是对象本身的局部变量?
$this->_view = new view($view);