2012-12-30 92 views
3

關於在類中使用全局函數的問題,我正在開發一個MVC系統。在類中使用全局函數是不好的做法嗎?

下面的方法是調用類中的方法,如模型,我的問題是我有在那裏的全局函數調用的重定向()我已經設定,在功能文件的視圖類的一部分這是加載在我的引導文件中,因爲所有的控制器都可能需要訪問它,這是一種不好的做法,或者我最好將此作爲控制器類的一種方法,因爲所有控制器都擴展了父控制器。

public function post($slug){ 

    if(!$slug){ redirect('blog'); } 

    $data = $this->model->getPost($slug); 
    $this->view->render('blog/single', $data); 
} 

或者靜態類會更有意義嗎?對於簡單的重定向函數來說似乎有點過分了。

+0

這對我來說似乎很好。 – Dai

+0

定義'靜態'類? – PeeHaa

+0

我在想一個靜態類的方法,對於一個小方法來說似乎太多了。 – Dave

回答

6

全局函數不一定是壞習慣。有兩件事要注意:

命名:您應該確保該函數的名稱避免衝突,並且對於它的相關性很明顯。您的重定向功能,它會預計它執行請求重定向。相反,如果您的方法與其他更具體的方法相關,則需要通過預先考慮一些上下文信息來清楚說明情況。

國家:全局函數應該是無狀態的。這意味着函數應該始終爲給定的輸入提供相同的結果。如果它根據一天中的時間做了不同的事情,某些變量的價值等......那麼通常這是不好的。這可能看起來像一個明顯的陷阱,但有更多微妙的版本的問題。最明顯的例外實際上是要求一天的時間...

它看起來像你的代碼中有遵守這兩條規則,所以它是完全可以接受的做到這一點。

編輯還有就是可測試性問題,因爲你是引用了在由類要求(或應該是)一個全球性的功能,你不能嘲笑這個。例如,在您的重定向示例中,如果不觸發重定向功能,則無法正確測試該類,並且不能使用函數的模擬版本來檢測真正的重定向方法是否已被調用。

+0

這是真的,但作爲一個簡單的函數,我很滿意。 – Dave

2

使用全局函數是不好的做法,因爲它會讓你的類無法測試。你應該把你想要的方法放到某個對象上,並把它作爲它們的依賴項傳遞給類。

+0

,因爲這很有意義,我認爲這種情況下主控制器將是它的最佳位置。 我的初始認爲視圖可能需要它,我也注意到代碼點火器使用全局函數重定向和base_url – Dave

0

正如你指出在評論這是一個很小的一個襯墊的方法,如果你使用PHP 5.3,而不是全球性會更好使用lambda函數,並傳遞它,而不是創建一個全新的類。

我會嘗試和設計代碼,所以依賴注入,也許暴露引導到控制器和存儲拉姆達在那裏然後只是把它在那裏你想要的。

請參閱http://fabien.potencier.org/article/17/on-php-5-3-lambda-functions-and-closures lambda使用,DI示例也將提供一些洞察力,希望。

相關問題