在PHP中引用现有对象...也许?

时间:2017-01-28 19:53:45

标签: php oop model-view-controller

这是我不明白的事情。我根据视频教程构建了一个非常酷的路由器和MCV系统,效果很好!有一件事我有点困惑。它不是特定于代码的任何内容,而是更多关于逻辑的内容。简而言之:

  1. 控制器来自网址
  2. 路由器调度控制器类并实例化它
  3. 实例化的控制器类扩展了一个基础 控制器并将使用相应的模型类
  4. 该模型类是静态的,不会被实例化。所以,让我们说我想创建一个新成员。从控制器类内部我会得到类似的东西:

    Model::createMember($this->first_name, $this->last_name, $this->screen_name, $this->created_date);
    

    然后,当然,在模型中,我将有一个方法在底层数据库中创建一个类似于以下内容的成员:

    public function createMember($first_name, $last_name, $screen_name, $created_date) { blah blah blah }
    

    这一切都很好,花花公子,但在我看来,我应该能够从模型中直接访问控制器对象的属性,并减轻必须传递所有这些参数。访问对象的属性对我来说似乎更多OOP,因此这就是我想要做的事情。

    问题是,我无法做到

    $controller_object = new Controller();
    

    从模型类中引用控制器并获取其属性的访问权限。

    控制器对象已经存在于路由器中,因此创建一个新对象对我没有好处。我需要能够创建一个引用该现有对象的变量。

    现在我有它工作,但我基本上使控制器对象的属性全局,然后可以使用全局关键字直接从模型类访问它们,但我不是真的想要这样做方式。

    我的想法是改进系统只是一个坏的,或者有没有办法引用现有的控制器对象,所以我可以直接访问它的公共属性,而不必将参数从控制器传递给模型?

1 个答案:

答案 0 :(得分:0)

你的问题的直接答案是使用$this,因为它实际上代表了你在控制器方法内的实例化控制器,所以而不是

Model::createMember($this->first_name, $this->last_name, $this->screen_name, $this->created_date);

你可以这样做

Model::createMember($this);

然后在模型中,您可以访问控制器对象。

实际上,我不这样做,因为模型实际上不应该依赖于控制器。

控制器职责是解析传入的请求数据,创建模型并将请求数据传递到模型中。

实际上不需要在控制器中使用first_namelast_name等属性。控制器可以只有一些带有传入数据的$data数组,它不应该关心这些数据的实际内容。

模型职责是验证数据(这也可以是一个单独的对象)并执行数据库操作或与数据相关的任何其他业务逻辑操作。

我也会避免使用模型的静态方法。而不是

Model::createMember(...parameters...)

我愿意

// $data is the request data parsed by controller
// controller knows how / where to get the data (from GET, POST, etc)
// but it doesn't care about the actual content
$model = Model($data)
... 
if ($model->validate()) {
    $model->save()
    // show success message to the user
} else {
    // show error message to the user
}