2012-04-22 108 views
9

我已經開始玩CodeIgniter了。 我使用他們的用戶指南和其他第三方教程供學習。我有點卡在私人功能的命名上。基於the user guide,我必須以私人功能的名稱爲前綴_。但in this tutorial,檢查添加註銷部分。其中有一個私人功能:private function check_isvalidated()。在這裏,它沒有以字符_作爲前綴。CodeIgniter - 私人功能

那麼這也是一個公認的命名約定? 與此同時,還有一個叫_output()Processing Output。 這是一個具有私有函數命名約定的公共函數!

這是一個有點當我嘗試以系統化的方式來學習混淆的。

回答

27

_前綴是在CONTROLLER定義的函數的約定。

用戶指南說:

在某些情況下,你可能想從公共訪問隱藏的某些功能。要使某個功能成爲專用,只需添加一個下劃線作爲名稱前綴,並且不會通過URL請求提供。

http://www.codeigniter.com/user_guide/general/controllers.html#private-methods

添加一個_是CodeIgniter的自己的控制器中的(僅在控制器)聲明函數的方式,不能由用戶直接調用:

  • Controller函數被映射到部分網址(controller/function
  • 控制器中有功能,不應映射到URL

    - they are declared as `private` (available since PHP5) 
    OR 
    - their names start with `_` (works also for PHP4) 
    

關於_output功能,它是公共的,但它可以,因爲它包含_不得直接調用。

爲什麼公開?

該功能被系統調用,因此它需要從類的外部訪問,這是不是一個私有函數。但是,它包含_以確保它不通過URL調用。總而言之,如果您的控制器中有不想通過url直接調用的函數,請添加_前綴,或者使用private訪問運算符。它們中的任何一個都足夠好。僅供參考,其他框架(如Yii或Zend框架)使用前綴action作爲可通過URL調用的所有控制器功能(被映射)。

+1

+1比我的更好的解釋。 – 2012-04-22 08:42:55

+0

@KemalFadillah謝謝。這是非常友善的:) – 2012-04-22 08:53:03

+3

當您製作自己的核心控制器時,使用'_'是理想的選擇,因爲您的其他控制器可以擴展以便在控制器之間共享相同的代碼。就本質而言,這些函數(在覈心控制器中定義的)必須公開才能被繼承和可見,但您不希望它們在路由中使用。使用靈活性是我喜歡CI的一個方面。 – 2012-04-22 08:59:26

4

儘管用戶指南確實要求您在控制器內使用下劃線將專用功能的函數名稱作爲前綴的前綴,但這並不是強制性的。儘管遵循約定可能是一個好主意,但建議您這樣做。

如果訪問修飾符是public,則可以看到以下劃線爲函數名稱加前綴時的顯着效果。在這種情況下,如果您嘗試通過URL訪問該功能,將會給您一個404錯誤。但在這種情況下,您將訪問修飾符設置爲private,是否在函數名稱前加下劃線並不重要。

但在本教程中,請查看添加註銷部分。其中有一個私有函數:private function check_isvalidated()。這裏的 沒有以字符_作爲前綴。

該教程中,函數名不以下劃線前綴,但它是一個私有函數,因爲它被聲明爲一個。因此,試圖通過URL訪問它不起作用。

與此同時,還有一個叫_output():處理 輸出。這是一個具有私人 函數的命名約定的公共函數!

我已經解釋了這一點,但我想指出_output()函數是在腳本執行過程中在某個特定位置調用的那些特殊函數之一。在這種情況下,CodeIgniter會在函數結束時調用這個函數,正當它是時候向瀏覽器輸出某些東西的時候。

+0

非常感謝。我現在明白了。 :) – 2012-04-22 09:45:50