Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MVC模式(OOP编程的新功能)处理PHP框架存在问题_Php_Frameworks - Fatal编程技术网

使用MVC模式(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

在我开始让你们知道我是OOP编程新手之前,请放松点

我目前正在开发一个PHP框架,我能够通过一个入口点来路由我的流量。这是下面的结构

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);