2011-08-03 51 views
3

我對控制器的使用有一些困惑。像通常一樣,路由器(調度器或前端控制器)在控制器類中調用一些靜態方法,例如PageController :: showIndexPage()。我的控制器通常有幾行代碼,這是通常的模型加載,獲取數據並傳遞給查看。PHP - 類中的靜態方法或只是一個函數

我的問題是 - 因爲每個http請求只執行一個方法,我應該避免類,只是爲控制器創建一個函數?有時,我真的有每個控制器有幾個方法,但每次只有一種方法正在使用。我知道這不是什麼大不了的事情,但也許我可以得到更好的系統?下面是一個例子:我的AuthController有類似showLoginPage(),doLogin(),doLogout()等方法。所以,避免使用類也許是個好主意,並且把這個控制器作爲幾個函數寫在分開的文件eq auth/show_login_page中。 PHP,auth/do_login.php等?這個概念是否有一些優點/缺點?

更新:因爲有些用戶膨脹我的靜態方法的使用,我必須防禦:)我不創建控制器的實例,因爲沒有必要這樣做。在99%的情況下,控制器僅用於將數據從模型傳遞到視圖。而且,只有一個方法調用不需要創建實例。這就是爲什麼方法是靜態的。這裏是我的例子控制器之一:

class ArticlesController { 

    static function showArticle($article_id) { 
     $article = ArticlesModel::getArticleById($article_id); 
     View::getInstance()->assignByRef("article", $article); 
     View::getInstance()->display("articles/one.tpl"); 
    } 
    static function showAllArticles() { 
     $articles = ArticlesModel::getAllArticles(); 
     View::getInstance()->assignByRef("articles", $articles); 
     View::getInstance()->display("articles/all.tpl"); 
    } 
} 

回答

2

靜態類函數就像全局函數一樣,所以不知道爲什麼你要爲你的控制器使用靜態類函數(這很不友好),所以要麼將它們全部改爲標準對象方法或全局函數。

我建議你將你的整個應用程序分支到一個分支中,該分支用全局函數替換所有控制器,而用非靜態類函數替換其他分支。那麼你可以更好地比較這兩個概念。

如果你不想玩弄,你要求指針,將所有靜態類函數轉換爲非靜態函數,然後繼續下去,直到遇到下一個問題。

0

我說,一起保留屬於什麼在一起。所以使用一個類。而且,使用一個類會自動提供某種名稱空間。僅僅因爲如果在幾個包含文件中有一個名爲doSomething()的方法,則不能包含這些文件中的多個文件。但是如果該方法被置於「靜態類」中,它們全部仍然可以包括在內。自PHP 5.3以來,您也可以使用「真實」名稱空間,但類方法仍然更好。

或想象你需要一個常數。如果它是一個類,則該常量在類範圍內。如果使用函數,則必須污染全局名稱空間,並且每次只能使用一個具有此名稱的常量。

+0

您可以將所有東西放在全局函數中,使它們屬於相同的前綴。就像你所說的那樣,它是一樣的「有點」命名空間。只是指出,因爲靜態類功能相當有限,你應該明智地使用它們,而不是一般的MVC模式恕我直言。 – hakre

+0

我覺得靜態類函數在幫助將全局函數分離到邏輯位置方面更加方便,它還允許自動加載函數和全局變量,而不是爲所有函數創建一個大文件,或者需要手動加載每個函數文件。 – Anther

0

不太理解已投票並標記爲正確答案的第一個答案。這裏是我的看法:

靜態方法就像全局方法,但更多地組織和包含在名稱空間和類中。這並不意味着它僅僅因爲這個定義而比對象更好。他們有他們的用法。如果你正在使用一個將保持特定狀態的類,而不是那個更適合成爲非靜態類的類,即你應該實例化並使用它。如果它不會在所述過程中保持特定狀態,即它只是接收參數對它做某事並返回它更適合靜態的響應。

這是我對靜態與非靜態的簡單化看法。在你的情況下,你可能需要其他的事情來發生你的控制器的順利工作。一個這樣的問題通常是有問題的,即靜態類沒有構造函數,因爲它們沒有實例化。這是爲什麼我認爲你的控制器可能被實例化的唯一好理由,如果父對象具有構造函數並且接收的對象被設置爲跨控制器使用。如果他們這麼簡單,我認爲你已經和靜態控制器合適。

至於你只是有功能或有類的問題。一個類將你的邏輯封裝成一個單元。這只是一種靜態的方式,無論這個組中的什麼都嚴格屬於這個單位。我們來自一個我們曾經擁有簡單功能的世界,但這個世界通常很快就會變形。看看軟件熵,他們是從發生的一點點阻止。由於課程是對他們所包含內容的引用,因此人們以這種方式使用它。你可以在一個文件的頂部有10個需要的圖像,然後你突然需要一個函數,開發人員可能不會考慮太多,只是將它添加到最接近的匹配文件之一,並說啊,它的所有包含它,所以它將工作。而對於類,你有點被迫去考慮把它放在哪裏,如果把它放在錯誤的地方,開發人員可能會錯過它,因爲它們不是全局可用的。

希望這會有所幫助。

相關問題