您好,登錄后才能下訂單哦!
ThinkPHP的核心采用的框架模式是CBD,也就是核心Core+行為Behavior+驅動Driver,核心也就是整個框架模式的核心,大部分都是一些基類,去規定規則,Behavior是行為,就是在指定的地方調用來完成一些特定的行為功能,而Driver驅動就類似cache緩存驅動,mysqldb 數據庫驅動等,完成功能
行為在手冊的13.1中說的很詳細.我只去寫一些實例.調用行為的方法.
調用方法是tags()
/** * 處理標簽擴展 * @param string $tag * 標簽名稱 * @param mixed $params * 傳入參數 * @return mixed */ function tag($tag, &$params = NULL) { // 系統標簽擴展 $extends = C ( 'extends.' . $tag ); // 應用標簽擴展 $tags = C ( 'tags.' . $tag ); if (! empty ( $tags )) { if (empty ( $tags ['_overlay'] ) && ! empty ( $extends )) { // 合并擴展 //array_unique 移除數組中重復的值 $tags = array_unique ( array_merge ( $extends, $tags ) ); } elseif (isset ( $tags ['_overlay'] )) { // 通過設置 '_overlay'=>1 覆蓋系統標簽 unset ( $tags ['_overlay'] ); } } elseif (! empty ( $extends )) { $tags = $extends; } if ($tags) { if (APP_DEBUG) { G ( $tag . 'Start' ); trace ( '[ ' . $tag . ' ] --START--', '', 'INFO' ); } // 執行擴展 foreach ( $tags as $key => $name ) { if (! is_int ( $key )) { // 指定行為類的完整路徑 用于模式擴展 $name = $key; } B ( $name, $params ); } if (APP_DEBUG) { // 記錄行為的執行日志 trace ( '[ ' . $tag . ' ] --END-- [ RunTime:' . G ( $tag . 'Start', $tag . 'End', 6 ) . 's ]', '', 'INFO' ); } } else { // 未執行任何行為 返回false return false; } }
tag調用的時候,可以指定覆蓋系統行為.之后會調用B函數去實例化行為對象.
/** * 執行某個行為 * * @param string $name * 行為名稱 * @param Mixed $params * 傳入的參數 * @return void */ function B($name, &$params = NULL) { if (strpos ( $name, '/' )) { list ( $name, $method ) = explode ( '/', $name ); } else { $method = 'run'; } $class = $name . 'Behavior'; if (APP_DEBUG) { G ( 'behaviorStart' ); } $behavior = new $class (); $behavior->$method ( $params ); if (APP_DEBUG) { // 記錄行為的執行日志 G ( 'behaviorEnd' ); trace ( $name . ' Behavior ::' . $method . ' [ RunTime:' . G ( 'behaviorStart', 'behaviorEnd', 6 ) . 's ]', '', 'INFO' ); } }
B函數可以實例化行為對象,并且傳入行為需要的參數.行為需要的參數可以在配置文件config.php中更改.并且會覆蓋行為中的默認參數.
行為的基類在Lib/Conf/Behavior.class.php中
protected $options = array(); 保存行為的參數
__construct 初始化類,參數賦值. 主要就是賦值,如果在config.php中存在的話,就用config.php中得覆蓋.
__get 獲取參數 獲取行為參數
run 行為唯一執行入口
在B函數中,也可以手動指定參數執行入口,方法是B('類名/方法名')的方式
默認的行為有:
CheckRoute | 檢測路由,路由匹配 |
ContentReplace | 模板內容輸出替換 |
ParseTemplate | 模板解析 |
ReadHtmlCache | 靜態緩存讀取 |
ShowPageTrace | 頁面Trace顯示 |
ShowRuntime | 運行時間顯示 |
TokenBuild | 表單令牌生成 |
WriteHtml | 靜態緩存寫入 |
擴展行為有
AgentCheck | 代理檢測 |
BrowserCheck | 瀏覽器檢測,防刷新 |
CheckActionRoute | 操作路由檢測 |
CheckLang | 語言檢測,并且自動加載語言包 |
CronRun | 自動任務 |
FireShowPageTrace | 將Trace輸出到firefox的firebug |
RobotCheck | 機器人檢測(就是檢測百度蜘蛛等) |
Upgrade | 自動升級提示行為 |
現在寫一個例子,大家就可以理解了.
在App.class.php中,App::run的方法里,有一個調用應用初始化標簽的地方.
/** * 運行應用實例 入口文件使用的快捷方法 * @access public * @return void */ static public function run() { // 項目初始化標簽 tag('app_init'); App::init(); // 項目開始標簽 tag('app_begin'); // Session初始化 session(C('SESSION_OPTIONS')); // 記錄應用初始化時間 G('initTime'); App::exec(); // 項目結束標簽 tag('app_end'); return ; }
現在在項目/Lib/Behavior里新建一個AppinitBehavior.class.php
<?php class AppinitBehavior extends Behavior{ function run(&$param){ echo '應用開始了'; } }
然后在項目/Conf/tags.php里
<?php return array( 'app_init'=>array( 'Appinit' ) );
這樣,在運行項目的時候,則會都輸出應用開始了.非常方便.如果要修改,擴展,都直接修改類或者擴展類即可,不需要修改源代碼,擴展性非常好.
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。