# 類庫
[上一頁](30.html "上一頁")[下一頁](32.html "下一頁")
ThinkPHP的類庫包括基類庫和應用類庫,系統的類庫命名規則如下:類庫 規則 示例 控制器類 模塊名+Action 例如 UserAction、InfoAction 模型類 模型名+Model 例如 UserModel、InfoModel 行為類 行為名+Behavior 例如CheckRouteBehavior Widget類 Widget名+Widget 例如BlogInfoWidget 驅動類 引擎名+驅動名 例如DbMysql表示mysql數據庫驅動、CacheFile表示文件緩存驅動 類名和文件名一致, 詳細命名規范可以參考1.6 命名規范。### 基類庫
基類庫是指符合ThinkPHP類庫規范的系統類庫,包括ThinkPHP的核心基類庫和擴展基類庫。核心基類庫目錄位于系統的Lib目錄,核心基類庫也就是Think類庫,擴展基類庫位于Extend/Library目錄,可以擴展ORG 、Com擴展類庫。核心基類庫的作用是完成框架的通用性開發而必須的基礎類和內置支持類等,包含有:目錄 調用路徑 說明 Lib/Core Think.Core 核心類庫包 Lib/Behavior Think.Behavior 內置行為類庫包 Lib/Driver Think.Driver 內置驅動類庫包 Lib/Template Think.Template 內置模板引擎類庫包 核心類庫包下面包含下面核心類庫:類名 說明 Action 系統基礎控制器類 App 系統應用類 Behavior 系統行為基礎類 Cache 系統緩存類 Db 系統抽象數據庫類 Dispatcher URL調度類 Log 系統日志類 Model 系統基礎模型類 Think 系統入口和靜態類 ThinkException 系統基礎異常類 View 視圖類 Widget 系統Widget基礎類### 應用類庫
應用類庫是指項目中自己定義或者使用的類庫,這些類庫也是遵循ThinkPHP的命名規范。應用類庫目錄位于項目目錄下面的Lib目錄。應用類庫的范圍很廣,包括Action類庫、Model類庫或者其他的工具類庫,通常包括:目錄 調用路徑 說明 Lib/Action @.Action或自動加載 控制器類庫包 Lib/Model @.Model或自動加載 模型類庫包 Lib/Behavior 用B方法調用或自動加載 應用行為類庫包 Lib/Widget 用W方法在模板中調用 應用Widget類庫包 項目根據自己的需要可以在項目類庫目錄下面添加自己的類庫包,例如Lib/Common、Lib/Tool等。### 類庫導入
ThinkPHP類庫的導入區別于其他的框架并沒有采用require或者require_once進行導入,所有類庫導入都采用統一的機制,包含下面兩種方式:#### 一、Import顯式導入
ThinkPHP模擬了Java的類庫導入機制,統一采用import方法進行類文件的加載。import方法是ThinkPHP內建的類庫導入方法,提供了方便和靈活的文件導入機制,完全可以替代PHP的require和include方法。例如:`import("Think.Util.Session");<br class="calibre5"></br>import("App.Model.UserModel");`import方法具有緩存和檢測機制,相同的文件不會重復導入,如果導入了不同的位置下面的同名類庫文件,系統也不會再次導入,例如:`import("Think.Util.Array");<br class="calibre5"></br>import("ORG.Util.Array");`上面的情況導入會產生引入兩個同名的Array.class.php 類,所以系統不會再次導入ORG.Util.Array類。
注意:在Unix或者Linux主機下面是區別大小寫的,所以在使用import方法的時候要注意目錄名和類庫名稱的大小寫,否則會導入失敗。
對于import方法,系統會自動識別導入類庫文件的位置,ThinkPHP的約定是Think、ORG、Com包的導入作為基類庫導入,否則就認為是項目應用類庫導入。`import("Think.Util.Session");<br class="calibre5"></br>import("ORG.Util.Page");`上面兩個方法分別導入了Think基類庫的Util/Session.class.php文件和ORG擴展類庫包的Util/Page.class.php文件。
要導入項目的應用類庫文件也很簡單,使用下面的方式就可以了,和導入基類庫的方式看起來差不多:`import("MyApp.Action.UserAction");<br class="calibre5"></br>import("MyApp.Model.InfoModel");`上面的方式分別表示導入MyApp項目下面的Lib/Action/UserAction.class.php和Lib/Model/InfoModel.class.php類文件。通常我們都是在當前項目里面導入所需的類庫文件,所以,我們可以使用下面的方式來簡化代碼`import("@.Action.UserAction");<br class="calibre5"></br>import("@.Model.InfoModel");`除了看起來簡單一些外,還可以方便項目類庫的移植。
如果要在當前項目下面導入其他項目的類庫,必須保證兩個項目的目錄是平級的,否則無法使用`import("OtherApp.Model.GroupModel");`的方式來加載其他項目的類庫。
我們知道,按照系統的規則,import方法是無法導入具有點號的類庫文件的,因為點號會直接轉化成斜線,例如我們定義了一個名稱為User.Info.class.php 的文件的話,采用:`import("ORG.User.Info");`方式加載的話就會出現錯誤,導致加載的文件不是ORG/User.Info.class.php 文件,而是ORG/User/Info.class.php 文件,這種情況下,我們可以使用:`import("ORG.User#Info");`來導入。
對于import方法,系統會自動識別導入類庫文件的位置,如果是其它情況的導入,需要指定import方法的第二個參數。例如,要導入當前文件所在目錄下面的
RBAC/AccessDecisionManager.class.php 文件,可以使用:`import("RBAC.AccessDecisionManager",dirname(__FILE__));`如果你要導入的類庫文件名的后綴不是class.php而是php,那么可以使用import方法的第三個參數指定后綴:`import("RBAC.AccessDecisionManager",dirname(__FILE__),".php");`我們建議您使用ThinkPHP開發過程保持類庫名稱采用class.php的后綴規范。#### 二,別名導入
除了命名空間的導入方式外,import方法還可以支持別名導入,要使用別名導入,首先要定義別名,我們可以在項目配置目錄下面增加alias.php 用以定義項目中需要用到的類庫別名,例如:`return?array(<br class="calibre5"></br>????'rbac'?=>LIB_PATH.'Common/Rbac.class.php',<br class="calibre5"></br>????'page'?=>LIB_PATH.'Common/Page.class.php',<br class="calibre5"></br>);`那么,現在就可以直接使用:`import("rbac");<br class="calibre5"></br>import("page");`導入Rbac和Page類,別名導入方式禁止使用import方法的第二和第三個參數,別名導入方式的效率比命名空間導入方式要高效,缺點是需要預先定義相關別名。
可以為某些需要的類庫定義別名,那么無需定義自動加載路徑也可以快速的自動加載。### 導入第三方類庫
我們知道 ThinkPHP 的基類庫都是以.class.php 為后綴的,這是系統內置的一個約定,當然也可以通過 import 的參數來控制, 為了更加方便引入其他框架和系統的類庫, 系統增加了導入第三方類庫的功能, 第三方類庫統一放置在系統擴展目錄下的Vendor 目錄,并且使用vendor 方法導入,其參數和 import 方法是 一致的,只是默認的值有針對變化。
例如,我們把 Zend 的 Filter\Dir.php 放到 Vendor 目錄下面,這個時候 Dir 文件的路徑就是
Vendor\Zend\Filter\Dir.php,我們使用vendor 方法導入只需要使用: `Vendor('Zend.Filter.Dir');`就可以導入Dir類庫了。
Vendor方法也可以支持和import方法一樣的基礎路徑和文件名后綴參數,例如:`Vendor('Zend.Filter.Dir',dirname(__FILE__),'.class.php');`### 自動加載
在大多數情況下,我們無需手動導入類庫,而是通過配置采用自動加載機制即可,自動加載機制是真正的按需加載,可以很大程度的提高性能。自動加載有三種情況,按照加載優先級從高到低分別是:別名自動加載、系統規則自動加載和自定義路徑自動加載。#### 一、別名自動加載
在前面我們提到了別名的定義方式,并且采用了import方法進行別名導入,其實所有定義別名的類庫都無需再手動加載,系統會按需自動加載。#### 二、 系統規則自動加載
果你沒有定義別名的話,系統會首先按照內置的規則來判斷加載,系統規則僅針對行為類、模型類和控制器類,搜索規則如下:類名 規則 說明 行為類 規則1 搜索系統類庫目錄下面的Behavior目錄 規則2 搜索系統擴展目錄下面的Behavior目錄 規則3 搜索應用類庫目錄下面的Behavior目錄 規則4 如果啟用了模式擴展,則搜索模式擴展目錄下面的Behavior目錄 模型類 規則1 如果啟用分組,則搜索應用類庫目錄的Model/當前分組 目錄 規則2 搜索應用類庫下面的Model目錄 規則3 搜索系統擴展目錄下面的Model目錄 控制器類 規則1 如果啟用分組,則搜索應用類庫目錄的Action/當前分組 目錄 規則2 搜索項目類庫目錄下面的Action目錄 規則3 搜索系統擴展目錄下面的Action目錄 注意:搜索的優先順序從上至下 ,一旦找到則返回,后面規則不再檢測。如果全部規則檢測完成后依然沒有找到類庫,則開始進行第三個自定義路徑自動加載檢測。#### 三、 自定義路徑自動加載
當你的類庫比較集中在某個目錄下面,而且不想定義太多的別名導入的話,可以使用自定義路徑自動加載方式,這種方式需要在項目配置文件中添加自動加載的搜索路徑,例如:`'APP_AUTOLOAD_PATH'?=>'@.Common,@.Tool',`表示,在當前項目類庫目錄下面的Common和Tool目錄下面的類庫可以自動加載。多個搜索路徑之間用逗號分割,并且注意定義的順序也就是自動搜索的順序。
注意:自動搜索路徑定義只能采用命名空間方式,也就是說這種方式只能自動加載項目類庫目錄和基類庫目錄下面的類庫文件。
[上一頁](30.html "上一頁")[下一頁](32.html "下一頁")
- 序言
- 1. 入門
- 1.1 簡介
- 1.2 基礎概念
- 1.3 獲取ThinkPHP
- 1.4 環境要求
- 1.5 許可協議
- 1.6 目錄結構
- 1.7 命名規范
- 1.8 MVC分層
- 1.9 CBD架構
- 1.10 特性概述
- 1.11 系統流程
- 1.12 開發流程
- 2. 入口
- 2.1 入口文件
- 2.2 項目目錄
- 2.3 部署目錄
- 2.4 項目編譯
- 2.5 調試模式
- 3. 配置
- 3.1 配置格式
- 3.2 慣例配置
- 3.3 項目配置
- 3.4 調試配置
- 3.5 分組配置
- 3.6 讀取配置
- 3.7 動態配置
- 3.8 擴展配置
- 4. 函數和類庫
- 4.1 函數庫
- 4.2 類庫
- 5. 控制器
- 5.1 URL模式
- 5.2 模塊和操作
- 5.3 定義控制器
- 5.4 空操作
- 5.5 空模塊
- 5.6 模塊分組
- 5.7 URL偽靜態
- 5.8 URL路由
- 5.9 URL重寫
- 5.10 URL生成
- 5.11 URL大小寫
- 5.12 前置和后置操作
- 5.13 跨模塊調用
- 5.14 頁面跳轉
- 5.15 重定向
- 5.16 獲取系統變量
- 5.17 判斷請求類型
- 5.18 獲取URL參數
- 5.19 AJAX返回
- 5.20 Action參數綁定
- 5.21 多層控制器支持
- 6. 模型
- 6.1 模型定義
- 6.2 模型實例化
- 6.3 字段定義
- 6.4 數據主鍵
- 6.5 屬性訪問
- 6.6 跨庫操作
- 6.7 連接數據庫
- 6.8 切換數據庫
- 6.9 分布式數據庫
- 6.10 創建數據
- 6.11 字段映射
- 6.12 連貫操作
- 6.13 CURD操作
- 6.14 ActiveRecord
- 6.15 自動驗證
- 6.16 命名范圍
- 6.17 自動完成
- 6.18 查詢語言
- 6.19 查詢鎖定
- 6.20 字段排除
- 6.21 事務支持
- 6.22 高級模型
- 6.23 視圖模型
- 6.24 關聯模型
- 6.25 Mongo模型
- 6.26 動態模型
- 6.27 虛擬模型
- 6.28 多層模型支持
- 7. 視圖
- 7.1 模板定義
- 7.2 模板賦值
- 7.3 模板輸出
- 7.4 模板替換
- 7.5 獲取內容
- 7.6 模板引擎
- 7.7 布局模板
- 8. 模板引擎
- 8.1 變量輸出
- 8.2 系統變量
- 8.3 使用函數
- 8.4 默認值輸出
- 8.5 使用運算符
- 8.6 內置標簽
- 8.7 包含文件
- 8.8 導入文件
- 8.9 Volist標簽
- 8.10 Foreach標簽
- 8.11 For標簽
- 8.12 Switch標簽
- 8.13 比較標簽
- 8.14 三元運算
- 8.15 范圍判斷標簽
- 8.16 Present標簽
- 8.17 Empty標簽
- 8.18 Defined標簽
- 8.19 Define標簽
- 8.20 Assign標簽
- 8.21 IF標簽
- 8.22 標簽嵌套
- 8.23 使用PHP代碼
- 8.24 模板布局
- 8.25 模板繼承
- 8.26 原樣輸出
- 8.27 模板注釋
- 8.28 引入標簽庫
- 8.29 修改定界符
- 8.30 避免JS混淆
- 9. 日志
- 9.1 日志級別
- 9.2 記錄方式
- 9.3 手動記錄
- 10. 錯誤
- 10.1 異常處理
- 10.2 異常模板
- 10.3 異常顯示
- 11. 調試
- 11.1 運行狀態
- 11.2 頁面Trace
- 11.3 調試方法
- 12. 緩存
- 12.1 緩存方式
- 12.2 動態緩存
- 12.3 緩存隊列
- 12.4 快捷緩存
- 12.5 快速緩存
- 12.6 查詢緩存
- 12.7 SQL解析緩存
- 12.8 靜態緩存
- 13. 擴展
- 13.1 行為擴展
- 13.2 類庫擴展
- 13.3 控制器擴展
- 13.4 模型擴展
- 13.5 驅動擴展
- 13.6 Widget擴展
- 13.7 模式擴展
- 13.8 引擎擴展
- 14. 安全
- 14.1 表單令牌
- 14.2 字段類型驗證
- 14.3 防止SQL注入
- 14.4 輸入過濾
- 14.5 上傳安全
- 14.6 防止XSS攻擊
- 14.7 其他安全建議
- 14.8 目錄安全文件
- 14.9 保護模板文件
- 15. 性能
- 15.1 關閉調試模式
- 15.2 開啟緩存
- 15.3 合并字段緩存
- 15.4 優化SQL
- 15.5 替換入口
- 15.6 前端優化
- 16. 部署
- 16.1 PATH_INFO支持
- 16.2 隱藏index.php
- 16.3 二級域名部署
- 16.4 定制錯誤頁面
- 16.5 設置時區
- 17. SAE支持
- 17.1 SAE介紹
- 17.2 獲取SAE
- 17.3 SAE開發
- 18. REST支持
- 18.1 REST介紹
- 18.2 REST模式
- 18.3 REST配置
- 18.4 REST路由
- 18.5 REST方法
- 19. 雜項
- 19.1 Session支持
- 19.2 Cookie支持
- 19.3 日期和時間
- 19.4 WML開發
- 19.5 多語言
- 19.6 數據分頁
- 19.7 文件上傳
- 19.8 驗證碼
- 19.9 圖片添加水印
- 19.10 IP獲取和定位
- 20. 附錄
- 20.1 常量參考
- 20.2 配置參考
- 20.3 關于升級
- 20.4 大事記
- 鳴謝
- 關于