2012-08-14 58 views
1

對不起,如果這已經被回答,我是PHP的OOP的新手。我正在嘗試構建一個用於教育和測試目的的mvc,並增加我對它的瞭解。我被困在一個點上,無法弄清楚。我相信這是一個簡單的解決方案,但我不知道正確的術語/單詞是什麼來查找它。php包括沒有使用靜態函數的類

如果答案已經存在,請讓我知道。

這裏就是我想要做:

class Load { 
    public function __construct(){ 
    } 

    public function model($file_name){ 
    include($file_name.'.php'); 
    } 
} 

class Home_model extends M_F_Model{ 
    function __construct() { 
    parent::__construct(); 
    } 

    public static function test_this_model($var){ 
    $result = $var.'+2'; 
    return $result; 
    } 
} 

class M_F_Controller { 
    public $load; 

    public function __construct(){ 
    $this->load = new Load(); 
    } 
} 

class Home extends M_F_Controller{ 
    function __construct(){ 
    parent::__construct(); 
    $this->load->model('home_model');  
    } 

    function index($var){ 
    $result = Home_model::test_this_model($var); 
    return $result; 
    } 
} 

我想轉Home_model::test_this_model();$this->home_model->test_this_model();無需申報home_model實例中Home類每類我可能要在包括未來,並避免使用靜態函數。

在此先感謝,讓我知道你是否需要任何進一步的信息。

回答

1

是否與做的一個問題:

$this->home_model = $this->load->model('home_model'); 

家庭內的構造,然後修改,而不是您的裝載機類的model函數返回一個新的實例,而不是僅僅包括文件?喜歡的東西:

public function model($file_name) { 
    include $file_name . '.php'; 
    $model = new $file_name(); 
    return $model; 
} 

(假定$file_name對應類名的文件裏)

+0

這是一種可能性。謝謝你的答案。我試圖保持它爲$ this-> load-> model('filename here');並仍然能夠做$ this-> home_model-> func();但如果這不可能,那麼這種方式是有效的。我剛剛開始學習前幾天..我試圖模仿CodeIgniter沒有直接複製.. – 2012-08-14 01:03:59

+0

上次我檢查CI是開源的。它不會傷害到峯值:) – 2012-08-14 02:01:16

+0

@LoganSerman,CodeIgiter的*開放性實際上是相當可疑的,因爲它主要由EllisLab控制。 – 2012-08-14 02:06:59

1

如果從CodeIgniter的學習MVC和OOP,然後你做錯了™。在您有相當先進的理解或OOP之前,您甚至不應該觸摸MVC模式,因爲它非常複雜,並且需要您瞭解諸如LoD,SoC,IoC和所有SOLID principles之類的內容。

模型不是類或對象。它是一個圖層。 MVC模式由兩層構成:模型層和表示層。表示層主要由視圖,控制器和模板構成,它提供用戶界面並處理用戶與之交互的方式。

控制器應該負責根據用戶的輸入改變模型層和當前視圖的狀態。不用於創建對象和渲染模板。他們不應該返回任何東西。

在控制器的基本工作流程應是:當前視圖的

  • 變化狀態
  • 從模型層
  • 獲取結構
  • 上該結構執行方法

答案:除非你想要將每個控制器綁定到特定的結構,你將需要兩條線來處理模型層。

你認爲「模型」實際上是domain objects,它們是模型層的一部分。你真的不應該直接訪問它們,但是剛開始學習MVC模式的人通常會這樣做。我懷疑,對於你當前的水平,this answer會提供最大的好處,但這不是我理解MVC模型的方式。對於高級版本,read this

另外,手動加載每個類是相當過時的做法。自PHP 5.1起,我們有spl_autoload_register(),它允許您創建一個共享的自動加載器,當您嘗試使用未知類時會觸發它。