2016-12-17 28 views
0

我是新來的編碼,我正在學習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; 
    } 
} 
+0

意見只包含HTML代碼在90%以上,剩下的只是你從你的控制器有變數這是使用方法時在引擎蓋下進行的引導。而你的模型,它可以由多個東西組成,通常分成多個子模型,如數據庫或服務提供者等等。 –

+0

'$ this-> model'是對象屬性(在上面聲明),並且可以被任何對象的方法訪問(像全局變量在函數內部可見而不用作爲參數傳遞它們)。 '$ model'只是傳遞給方法的局部變量(這裏是:構造函數)。方法/函數範圍變量在離開函數後被銷燬,但屬性被保留。 – shudder

+0

標題中的問題(*「$ this-> model = $ model是什麼意思?」*)與MVC無關。這是關於PHP面向對象的編程。請閱讀[documentation](http://php.net/manual/en/language.oop5.php)或查找OOP教程。 – axiac

回答

1

控制器是MVC應用程序的傳輸層。這意味着,控制器從請求(HTTP或CLI)中檢索數據,然後將數據(如果有的話)傳遞給知道應用程序業務邏輯的類,該類最簡單的形式就是模型。模型執行其邏輯並將其結果返回給控制器。然後控制器將數據交給一個視圖文件來表示它。所以,簡而言之:

  • 控制器從請求中檢索數據。
  • 控制器把它交給一個知道如何處理業務邏輯的類;最簡單形式的模型類。
  • 該模型然後完成它的工作並返回結果。在大多數情況下,模型代表一個實體並保持其狀態。通常是模型動作,操縱狀態。它對控制器或視圖一無所知。
  • 控制器將結果(通常是模型狀態)移交給視圖文件。
  • 視圖代表結果(模型狀態)。

所謂的「MVC框架」是爲開發人員提供這種編排所需的工具而構建的。我強烈建議你看看這樣的框架,而不是寫你自己的。

MVC Paradigm Diagram

你會看到很多圍繞這些圖表;如果你已經知道MVC是如何工作的,它們纔有意義。

所以,從理論上說,我們知道,一個控制器需要與一個或多個模型類作爲它的依賴交互。但是,我們將如何實現這一點?一種方法是利用class properties來保存所需模型的實例。因此,控制器可以像訪問$this->model->whatever一樣輕鬆訪問它們。

您需要知道的另一個流行概念是Dependency Injection。這是一個設計模式,它的名稱如何。在簡單的話,你注入類依賴性或者通過它的構造(稱爲構造注射)或通過其設置方法(已知爲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; 
    } 
}