$ this-> model = $ model;意味着在MVC中

时间:2016-12-17 09:48:37

标签: php model-view-controller

我是编码新手,我正在学习MVC。

你能解释一下这个简单的代码吗?

model.php

<?php
class Model
{
    public $string;

    public function __construct()
    {
        $this->string = "MVC + PHP = Awesome!";
    }
}

View.php

<?php
class View
{
    private $model;
    private $controller;

    public function __construct($controller,$model)
    {
        $this->controller = $controller;
        $this->model = $model;
    }

    public function output()
    {
        return "<p>" . $this->model->string . "</p>";
    }
}

Controller.php这样

<?php
class Controller
{
    private $model;

    public function __construct($model)
    {
        $this->model = $model;
    }
}

2 个答案:

答案 0 :(得分:2)

控制器是MVC应用程序的传输层。这意味着,控制器从请求(HTTP或CLI)检索数据,然后将数据(如果有的话)交给一个知道应用程序业务逻辑的类,该逻辑最简单的形式是模型。模型执行其逻辑并将其结果返回给控制器。然后,控制器将数据移交给视图文件以表示它。所以,简而言之:

  • Controller从请求中检索数据。
  • 控制器将其交给一个知道如何处理业务逻辑的类;最简单形式的模型类。
  • 然后模型完成其工作并返回结果。在大多数情况下,模型代表一个实体并保持其状态。通常是模型动作,操纵状态。它对控制器或视图一无所知。
  • 控制器将结果(通常是模型状态)移交给视图文件。
  • 视图表示结果(模型状态)。

所谓的“MVC框架”旨在为开发人员提供此类编排所需的工具。我强烈建议您研究这样的框架,而不是自己编写。

MVC Paradigm Diagram

你会看到很多这些图表;如果您已经了解MVC的工作原理,它们才有意义。

因此,从理论上讲,我们知道控制器需要与一个或多个模型类交互作为其依赖关系。但是我们如何实现这一目标呢?一种方法是利用class properties来保存所需模型的实例。因此,控制器可以像$this->model->whatever一样轻松访问它们。

您需要了解的另一个流行概念是Dependency Injection。这是一种设计模式,就像名称所说的那样。简单来说,您可以通过构造函数(称为构造函数注入)或通过其setter方法(称为setter注入)注入类依赖项。如果使用正确,它会使类与其依赖关系松散耦合,因为它们可能从外部注入。

现在你已经了解了MVC和DI的基本概念,让我们再看一下你的代码:

<?php
class Controller
{
    // Designate a place to hold class dependencies
    private $model;

    // Accept a $model instance in the constructor, so the 
    // dependencies can be injected from the outside
    public function __construct($model)
    {
        // Set the dependency in a class property, so it's easily
        // accessible for later use of class methods.
        $this->model = $model;
    }
}

答案 1 :(得分:1)

  • 您使用私有$ model
  • 声明了您宣布的$ model
  • 将其称为$ this-&gt;模型,因为它是此特定对象的变量,并且它可能在每个对象实例中占用不同的值
  • 在实例化对象时为其分配您在构造函数中传递的$ model的值

以下示例演示了$ this-&gt; var = $ var的工作方式。 我们可以看到,我们将2个不同的模型传递给视图。

class Model
{
    public $string;

    public function __construct($string = NULL)
    {
        if(!empty($string)){
            $this->string = "DEFINIETLY AWESOME";
        } else {
            $this->string = "MVC + PHP = Awesome!";
        }
    }
}

class View
{
    private $model;
    private $controller;

    public function __construct($controller,$model)
    {
        $this->controller = $controller;
        $this->model = $model;
    }

    public function output()
    {
        return "<p>" . $this->model->string . "</p>";
    }
}

class Controller
{
    private $model;

    public function __construct($model)
    {
        $this->model = $model;
    }
}

$model = new Model(); 
$controller = new Controller($model); 
$view = new View($controller, $model); 
echo $view->output();
// MVC + PHP = Awesome!

$model = new Model("a"); 
$controller = new Controller($model); 
$view = new View($controller, $model); 
echo $view->output();
// DEFINIETLY AWESOME

但是,从MVC的角度来看:我们不需要将$ controller传递给View。

class Model
{
    public $text;
    public function __construct()
    {
        $this->text = 'Hello world!';
    }
}

class View
{
    private $model;
    public function __construct(Model $model)
    {
        $this->model = $model;
    }

    public function output()
    {
        return '<h1>' . $this->model->text .'</h1>';
    }
}

class Controller
{
    private $model;
    public function __construct(Model $model)
    {
        $this->model = $model;
    }
}

//initiate the triad
$model = new Model();
//It is important that the controller and the view share the model
$controller = new Controller($model);
$view = new View($model);
echo $view->output();