1

在我开始让您知道我是 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 = new $model;$this->_view = new view;

但是当我运行$this->_view->render();或者$gamerequests_array = $this->main_model->tab_query($tab);

它说该对象不存在。这是我得到的确切错误消息。

Notice: Undefined property: main_controller::$main_model

Fatal error: Call to a member function tab_query() on a non-object

所以在这一点上,我知道问题在于设置新对象的框架。我一直在努力解决这个问题,此时我需要一些帮助。

如果有人需要额外的代码,请随时请求,我会发布它。

4

2 回答 2

2

从这一行:

$this->$model = new $model;

看来您传入了一个字符串并将其用作属性名称和类名称。也许您传递的名称不完全是main_model. 尽管变量/属性名区分大小写,但类名不区分大小写。所以,他们可能是一个案例不匹配。通过$thisget_object_vars查看可用的属性。请记住,以这种方式动态添加属性将使它们公开。

还应检查这些行:

$this->_view = $view;

$this->_view = new view;

您正在覆盖该属性。我确定这是无意的,可能是您遇到的问题的一部分。也许您正尝试使用与控制器相同的方法(存储名称、用于实例化和访问)。

于 2012-04-25T20:26:58.767 回答
0
$this->$model = new $model;

这只有在 $model 的值也恰好是已经设置的属性时才可能起作用。这意味着它只能包含值 '_controller'、'_id'、'_model' 和 '_view' 否则它会抛出一个错误 ( Notice: Undefined property: main_controller::$main_model and Fatal error: Call to a member function tab_query() on a non-object) - 即使它具有这些值之一,它仍然会覆盖您设置的任何值财产作为。

如果您尝试将视图动态设置为某种东西,您可能希望将$viewView 构造函数作为参数传递:

$this->_view = new view($view);

$view您可以通过使用带有大小写开关返回适当对象的全局函数或 View 类的方法为不同的值设置不同的行为来进一步扩展它。

于 2012-04-25T20:37:10.003 回答