0

编辑:解决了!

我最近一直在研究自己的框架。我有一个这样的控制器类:

class Controller {
    private $model;

    public function __construct() {
        global $bean_db, $mv_name;

        if (file_exists(APP_PATH . 'models/' . $mv_name . '.php')) {
            require APP_PATH . 'models/' . $mv_name . '.php';

            $model_name = $mv_name . '_Model';
            $model = new $model_name;
            $this->model = $model;
        }
    }
}

现在,在一个特定的控制器文件中,我有这样的代码:

class Start_Controller extends Controller {
    function execute() {
        $this->model->exec("SET NAMES 'utf8'");
    }
}

正如您可能期望或可能不期望的那样,这不起作用。我收到一条错误消息,指出名为“model”的属性不存在。谁能帮我解决这个问题?

4

3 回答 3

7

因为一个private变量仅限于这个类,不是任何孩子。
你需要protected这个案例

于 2012-04-17T19:42:56.910 回答
1

制作model protected而不是private. 这是一个立竿见影的解决方案,但您可能还想重新设计控制器访问其模型的方式。

于 2012-04-17T19:42:47.227 回答
0

私有成员对声明它们的类是专有的。它们不能在其他任何地方访问,即使在子类中也是如此。

您可以通过以下两种方式之一来克服这个问题。

  1. 使私有成员受保护
  2. 为私有成员提供受保护的 getter

通常你会做前者,但在某些情况下后者可能是一种更明智的方法(例如,如果你需要对成员进行只读访问)。

于 2012-04-17T19:45:07.693 回答