thinkPHP學習筆記之基礎概念(一)

這里記錄的是本人學習的thinkPHP筆記官方開發手冊
http://document.thinkphp.cn/manual_3_2.html

一、thinkPHP3.2目錄結構

工程目錄
www WEB部署目錄(或者子目錄)
├─index.php 入口文件
├─README.md README文件
├─Application 應用目錄
├─Public 資源文件目錄
└─ThinkPHP 框架目錄
TP框架結構
├─ThinkPHP 框架系統目錄(可以部署在非web目錄下面)
│ ├─Common 核心公共函數目錄
│ ├─Conf 核心配置目錄
│ ├─Lang 核心語言包目錄
│ ├─Library 框架類庫目錄
│ │ ├─Think 核心Think類庫包目錄
│ │ ├─Behavior 行為類庫目錄
│ │ ├─Org Org類庫包目錄
│ │ ├─Vendor 第三方類庫目錄
│ │ ├─ ... 更多類庫目錄
│ ├─Mode 框架應用模式目錄
│ ├─Tpl 系統模板目錄
│ ├─LICENSE.txt 框架授權協議文件
│ ├─logo.png 框架LOGO文件
│ ├─README.txt 框架README文件
│ └─ThinkPHP.php 框架入口文件

從3.2開始TP默認給我們提供了一個已經配置好的入口文件和一個應用程序目錄,應用程序目錄是空的,當你第一在瀏覽器中輸入"localhost/工程名稱/"的時候會在application目錄自動生成一個程序,目錄如下:

Application
├─Common 應用公共模塊
│ ├─Common 應用公共函數目錄
│ └─Conf 應用公共配置文件目錄
├─Home 默認生成的Home模塊
│ ├─Conf 模塊配置文件目錄
│ ├─Common 模塊函數公共目錄
│ ├─Controller 模塊控制器目錄
│ ├─Model 模塊模型目錄
│ └─View 模塊視圖文件目錄
├─Runtime 運行時目錄
│ ├─Cache 模版緩存目錄
│ ├─Data 數據目錄
│ ├─Logs 日志目錄
│ └─Temp 緩存目錄

二、TP命名規范

TP命名采用駝峰法命名,對于類名首字母要大寫,對于M類和C類要有Model后綴和Controller后綴。

  1. 對于控制器類:類名+Controller.class.php 并且繼承自extends Controller或者Controller的子類
  2. 對于模型類:類名+Model.class.php 并且繼承自extends Model或者Model的子類
  3. 對于視圖文件名:Home/View/模塊名(以對應控制器命名的文件夾)/視圖名(以對應控制器中要顯示該視圖函數的名稱命名)

注:對于視圖文件的命名方式可以隨意,但是在控制器中顯示該視圖的函數中display方法就要帶有參數了,參數的方式有多中
例如:對應控制器sunleiController.class.php 視圖的路徑為:/Home/View/long/add.html
控制其中有一個方法sun(),此方法中的display需要這樣寫$this->display(‘long:add’);,這種方式不是唯一的,也可以用其他形式的參數
在瀏覽器中輸入localhost/工程名/index.php/sunlei/sun 即可

三、解釋下其中的幾個概念:

名稱 描述
應用 基于同一個入口文件訪問的項目我們稱之為一個應用。
模塊 一個應用下面可以包含多個模塊,每個模塊在應用目錄下面都是一個獨立的子目錄,包含配置文件,MVC文件等,3.2以后默認生成一個Home模塊。
控制器 每個模塊可以包含多個控制器,一個控制器通常體現為一個控制器類。
操作 每個控制器類可以包含多個操作方法,也可能是綁定的某個操作類,每個操作是URL訪問的最小單元。

模塊化設計的思想下面,模塊是最重要的部分,模塊其實是一個包含配置文件、函數文件和MVC文件(目錄)的集合。

四、URL模式

官方鏈接:http://document.thinkphp.cn/manual_3_2.html#url

如果我們直接訪問入口文件的話,由于URL中沒有模塊名、控制器名稱(不包括Controller后綴)和操作名稱(函數名稱),因此系統會訪問默認模塊(Home)下面的默認控制器(Index)的默認操作(index),因此下面的訪問是等效的:
http://serverName/index.php
http://serverName/index.php/Home/Index/index
http://serverName/index.php/?m=Home/Index&a=index

上面這種URL模式就是系統默認的PATHINFO模式,也是最常用的模式,不同的URL模式獲取模塊和操作的方法不同,ThinkPHP支持的URL模式有四種:普通模式、PATHINFO、REWRITE和兼容模式,可以設置URL_MODEL參數改變URL模式。

URL模式 URL_MODEL設置
普通模式 0
PATHINFO模式 1
REWRITE模式 2
兼容模式 3

如果你整個應用下面的模塊都是采用統一的URL模式,就可以在應用的配置文件中設置URL模式,如果不同的模塊需要設置不同的URL模式,則可以在模塊的配置文件中設置。

五、函數參數的綁定

參數綁定功能默認是開啟的,其原理是把URL中的參數(不包括模塊、控制器和操作名)和操作方法中的參數進行綁定。
要啟用參數綁定功能,首先確保你開啟了URL_PARAMS_BIND設置:
'URL_PARAMS_BIND' => true, // URL變量綁定到操作方法作為參數

參數綁定有兩種方式:按照變量名綁定(默認)和按照變量順序綁定。

注意:對于帶有參數的函數,如果URL沒有傳入對應的參數值,則會報錯,為避免報錯我們可以給函數設置一個默認值
如:
public function read($id=0){
echo 'id='.$id;
}

六、偽靜態

URL偽靜態通常是為了滿足更好的SEO效果,ThinkPHP支持偽靜態URL設置,可以通過設置URL_HTML_SUFFIX參數隨意在URL的最后增加你想要的靜態后綴,而不會影響當前操作的正常執行。例如,我們設置

'URL_HTML_SUFFIX'=>'shtml'

的話,我們可以把下面的URL http://serverName/Home/Blog/read/id/1 變成 http://serverName/Home/Blog/read/id/1.shtml
后者更具有靜態頁面的URL特征,但是具有和前面的URL相同的執行效果,并且不會影響原來參數的使用。
默認情況下,偽靜態的設置為html,如果我們設置偽靜態后綴為空,

'URL_HTML_SUFFIX'=>''

則可以支持所有的靜態后綴,并且會記錄當前的偽靜態后綴到常量 EXT ,但不會影響正常的頁面訪問。
例如:
http://serverName/Home/blog/3.html
http://serverName/Home/blog/3.shtml
http://serverName/Home/blog/3.xml
http://serverName/Home/blog/3.pdf

都可以正常訪問,如果要獲取當前的偽靜態后綴,通過常量 EXT 獲取即可。
如果希望支持多個偽靜態后綴,可以直接設置如下:

// 多個偽靜態后綴設置 用|分割
'URL_HTML_SUFFIX' => 'html|shtml|xml'

那么,當訪問 http://serverName/Home/blog/3.pdf 的時候會報系統錯誤。
可以設置禁止訪問的URL后綴,例如:
'URL_DENY_SUFFIX' => 'pdf|ico|png|gif|jpg', // URL禁止訪問的后綴設置

如果訪問 http://serverName/Home/blog/3.pdf 就會直接返回404錯誤。
注意:
URL_DENY_SUFFIX的優先級比URL_HTML_SUFFIX要高。

七、URL的大小寫問題

對于Windows來說URL是不區分大小寫的,但是在Linux下是區分大小寫的,但是TP框架給了我們配置的權利,我們可以通過配置
'URL_CASE_INSENSITIVE' =>true
來達到在任何平臺下都不區分大小寫

這里需要注意一個地方,一旦開啟了不區分URL大小寫后,如果我們要訪問類似UserTypeController的控制器,那么正確的URL訪問應該是:
// 正確的訪問地址
http://serverName/index.php/home/user_type/index
// 錯誤的訪問地址(linux環境下)
http://serverName/index.php/home/usertype/index

利用系統提供的U方法可以為你自動生成相關的URL地址。

如果設置
'URL_CASE_INSENSITIVE' =>false

的話,URL就又變成: http://serverName/index.php/Home/UserType/add
注意:URL不區分大小寫并不會改變系統的命名規范,并且只有按照系統的命名規范后才能正確的實現URL不區分大小寫。

建議還是習慣性的區分大小寫吧,系統默認的規范是根據URL里面的模塊名、控制器名來定位到具體的控制器類的,從而執行控制器類的操作方法。

在MVC三層中,ThinkPHP并不依賴M或者V,甚至可以只有C或者只有V,這個在ThinkPHP的設計里面是一個很重要的用戶體驗設計,用戶只需要定義視圖,在沒有C的情況下也能自動識別。

八、庫文件自動加載的順序(優先級)

在實際的應用類庫加載過程中,往往會涉及到自動加載的優先級問題,以Test\MyClass類為例,自動加載的優先順序如下:
1.判斷是否有注冊了Test\MyClass類庫映射,如果有則自動加載類庫映射定義的文件;
2.判斷是否存在Library/Test目錄,有則以該目錄為初始目錄加載;
3.判斷是否有注冊Test根命名空間,有則以注冊的目錄為初始目錄加載;
4.如果以上都不成立,則以Test為模塊目錄進行初始目錄加載;
5.然后以上面獲取到的初始目錄加載命名空間對應路徑的文件;

九、TP常用函數

  1. U函數
    用于獲取URL的:U()
U('/Admin/Insert/insert@localhost’)
  1. C函數
    之前的方式都是通過預先定義配置文件的方式,而在具體的操作方法里面,我們仍然可以對某些參數進行動態配置(或者增加新的配置),主要是指那些還沒有被使用的參數。
    設置新的值:
    C('參數名稱','新的參數值')
    動態配置賦值僅對當前請求有效,不會對以后的請求造成影響。
    獲取已設置的配置參數的值:
$config = C('參數名稱');
  1. A函數
    默認情況下,A方法實例化的是默認控制器層(Controller)
    如果控制器有分層控制器,要實例化分層控制器的話,則寫二級模塊名,否則第二個參數可以忽略
    A('模塊名/控制器名','二級模塊名')
    訪問控制器(默認是Home,可以設置)的實例化通常是自動完成的,系統會根據URL地址解析出訪問的控制器名稱自動實例化,并且調用相關的操作方法。
    如果你需要跨控制器調用的話,則可以單獨實例化:
// 實例化Home模塊的User控制器
$User = new \Home\Controller\UserController();
// 實例化Admin模塊的Blog控制器
$Blog = new \Admin\Controller\BlogController();

系統為上面的控制器實例化提供了一個快捷調用方法A,上面的代碼可以簡化為:

// 假設當前模塊是Home模塊
$User = A('User'); 
$Blog = A('Admin/Blog');

默認情況下,A方法實例化的是默認控制器層(Controller),如果你要實例化其他的分層控制器的話,可以使用:

// 假設當前模塊是Home模塊
// 實例化Event控制器
$User = A('User','Event'); 
$Blog = A('Admin/Blog','Event');

上面的代碼等效于:

// 實例化Home模塊的User事件控制器
$User = new \Home\Event\UserEvent();
// 實例化Admin模塊的Blog事件控制器
$Blog = new \Admin\Event\BlogEvent();
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,806評論 18 139
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,356評論 0 6
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,682評論 25 708
  • 如圖項目結構目錄 首先將引入的項目直接導入或者拖進你的項目中,然后進行如下操作即可。 整個過程非常簡單,但是遇到了...
    天空沒有太陽閱讀 4,808評論 0 51
  • 2017-7-24 --著:江涵小子 丁環小寶 甜蜜幸福饒心梁 尋找真情在側旁 丁環小寶與江涵 互訴衷腸愛永伴
    江涵少年閱讀 127評論 0 0