ThinkPHP的核心采用的架構模式是CBD,也就是核心Core+行為Behavior+驅動Driver,核心也就是整個架構模式的核心,大部分都是一些基類,去規定規則,Behavior是行為,就是在指定的地方調用來完成一些特定的行為功能,而Driver驅動就類似cache緩存驅動,mysqldb 資料庫驅動等,完成功能
行為在手冊的13.1中說的很詳細.我隻去寫一些執行個體.調用行為的方法.
調用方法是tags()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<code>/**</code>
<code> </code><code>* 處理标簽擴充</code>
<code> </code><code>* @param string $tag</code>
<code> </code><code>* 标簽名稱</code>
<code> </code><code>* @param mixed $params</code>
<code> </code><code>* 傳入參數</code>
<code> </code><code>* @return mixed</code>
<code> </code><code>*/</code>
<code>function</code> <code>tag(</code><code>$tag</code><code>, &</code><code>$params</code> <code>= NULL) {</code>
<code> </code><code>// 系統标簽擴充</code>
<code> </code><code>$extends</code> <code>= C ( </code><code>'extends.'</code> <code>. </code><code>$tag</code> <code>);</code>
<code> </code><code>// 應用标簽擴充</code>
<code> </code><code>$tags</code> <code>= C ( </code><code>'tags.'</code> <code>. </code><code>$tag</code> <code>);</code>
<code> </code><code>if</code> <code>(! </code><code>empty</code> <code>( </code><code>$tags</code> <code>)) {</code>
<code> </code><code>if</code> <code>(</code><code>empty</code> <code>( </code><code>$tags</code> <code>[</code><code>'_overlay'</code><code>] ) && ! </code><code>empty</code> <code>( </code><code>$extends</code> <code>)) { </code><code>// 合并擴充</code>
<code> </code><code>//array_unique 移除數組中重複的值</code>
<code> </code><code>$tags</code> <code>= </code><code>array_unique</code> <code>( </code><code>array_merge</code> <code>( </code><code>$extends</code><code>, </code><code>$tags</code> <code>) );</code>
<code> </code><code>} </code><code>elseif</code> <code>(isset ( </code><code>$tags</code> <code>[</code><code>'_overlay'</code><code>] )) { </code><code>// 通過設定 '_overlay'=>1 覆寫系統标簽</code>
<code> </code><code>unset ( </code><code>$tags</code> <code>[</code><code>'_overlay'</code><code>] );</code>
<code> </code><code>}</code>
<code> </code><code>} </code><code>elseif</code> <code>(! </code><code>empty</code> <code>( </code><code>$extends</code> <code>)) {</code>
<code> </code><code>$tags</code> <code>= </code><code>$extends</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>if</code> <code>(</code><code>$tags</code><code>) {</code>
<code> </code><code>if</code> <code>(APP_DEBUG) {</code>
<code> </code><code>G ( </code><code>$tag</code> <code>. </code><code>'Start'</code> <code>);</code>
<code> </code><code>trace ( </code><code>'[ '</code> <code>. </code><code>$tag</code> <code>. </code><code>' ] --START--'</code><code>, </code><code>''</code><code>, </code><code>'INFO'</code> <code>);</code>
<code> </code><code>// 執行擴充</code>
<code> </code><code>foreach</code> <code>( </code><code>$tags</code> <code>as</code> <code>$key</code> <code>=> </code><code>$name</code> <code>) {</code>
<code> </code><code>if</code> <code>(! </code><code>is_int</code> <code>( </code><code>$key</code> <code>)) { </code><code>// 指定行為類的完整路徑 用于模式擴充</code>
<code> </code><code>$name</code> <code>= </code><code>$key</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>B ( </code><code>$name</code><code>, </code><code>$params</code> <code>);</code>
<code> </code><code>if</code> <code>(APP_DEBUG) { </code><code>// 記錄行為的執行日志</code>
<code> </code><code>trace ( </code><code>'[ '</code> <code>. </code><code>$tag</code> <code>. </code><code>' ] --END-- [ RunTime:'</code> <code>. G ( </code><code>$tag</code> <code>. </code><code>'Start'</code><code>, </code><code>$tag</code> <code>. </code><code>'End'</code><code>, 6 ) . </code><code>'s ]'</code><code>, </code><code>''</code><code>, </code><code>'INFO'</code> <code>);</code>
<code> </code><code>} </code><code>else</code> <code>{ </code><code>// 未執行任何行為 傳回false</code>
<code> </code><code>return</code> <code>false;</code>
<code>}</code>
tag調用的時候,可以指定覆寫系統行為.之後會調用B函數去執行個體化行為對象.
<code> </code><code>* 執行某個行為</code>
<code> </code><code>*</code>
<code> </code><code>* @param string $name</code>
<code> </code><code>* 行為名稱</code>
<code> </code><code>* @param Mixed $params</code>
<code> </code><code>* 傳入的參數</code>
<code> </code><code>* @return void</code>
<code>function</code> <code>B(</code><code>$name</code><code>, &</code><code>$params</code> <code>= NULL) {</code>
<code> </code><code>if</code> <code>(</code><code>strpos</code> <code>( </code><code>$name</code><code>, </code><code>'/'</code> <code>)) {</code>
<code> </code><code>list ( </code><code>$name</code><code>, </code><code>$method</code> <code>) = </code><code>explode</code> <code>( </code><code>'/'</code><code>, </code><code>$name</code> <code>);</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>$method</code> <code>= </code><code>'run'</code><code>;</code>
<code> </code><code>$class</code> <code>= </code><code>$name</code> <code>. </code><code>'Behavior'</code><code>;</code>
<code> </code><code>if</code> <code>(APP_DEBUG) {</code>
<code> </code><code>G ( </code><code>'behaviorStart'</code> <code>);</code>
<code> </code><code>$behavior</code> <code>= </code><code>new</code> <code>$class</code> <code>();</code>
<code> </code><code>$behavior</code><code>-></code><code>$method</code> <code>( </code><code>$params</code> <code>);</code>
<code> </code><code>if</code> <code>(APP_DEBUG) { </code><code>// 記錄行為的執行日志</code>
<code> </code><code>G ( </code><code>'behaviorEnd'</code> <code>);</code>
<code> </code><code>trace ( </code><code>$name</code> <code>. </code><code>' Behavior ::'</code> <code>. </code><code>$method</code> <code>. </code><code>' [ RunTime:'</code> <code>. G ( </code><code>'behaviorStart'</code><code>, </code><code>'behaviorEnd'</code><code>, 6 ) . </code><code>'s ]'</code><code>, </code><code>''</code><code>, </code><code>'INFO'</code> <code>);</code>
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的方法裡,有一個調用應用初始化标簽的地方.
<code> </code><code>* 運作應用執行個體 入口檔案使用的快捷方法</code>
<code> </code><code>* @access public</code>
<code> </code><code>* @return void</code>
<code> </code><code>*/</code>
<code> </code><code>static</code> <code>public</code> <code>function</code> <code>run() {</code>
<code> </code><code>// 項目初始化标簽</code>
<code> </code><code>tag(</code><code>'app_init'</code><code>);</code>
<code> </code><code>App::init();</code>
<code> </code><code>// 項目開始标簽</code>
<code> </code><code>tag(</code><code>'app_begin'</code><code>);</code>
<code> </code><code>// Session初始化</code>
<code> </code><code>session(C(</code><code>'SESSION_OPTIONS'</code><code>));</code>
<code> </code><code>// 記錄應用初始化時間</code>
<code> </code><code>G(</code><code>'initTime'</code><code>);</code>
<code> </code><code>App::</code><code>exec</code><code>();</code>
<code> </code><code>// 項目結束标簽</code>
<code> </code><code>tag(</code><code>'app_end'</code><code>);</code>
<code> </code><code>return</code> <code>;</code>
現在在項目/Lib/Behavior裡建立一個AppinitBehavior.class.php
<code><?php</code>
<code>class</code> <code>AppinitBehavior </code><code>extends</code> <code>Behavior{</code>
<code> </code><code>function</code> <code>run(&</code><code>$param</code><code>){</code>
<code> </code><code>echo</code> <code>'應用開始了'</code><code>;</code>
然後在項目/Conf/tags.php裡
<code>return</code> <code>array</code><code>(</code>
<code> </code><code>'app_init'</code><code>=></code><code>array</code><code>(</code>
<code> </code><code>'Appinit'</code>
<code> </code><code>)</code>
<code>);</code>
這樣,在運作項目的時候,則會都輸出應用開始了.非常友善.如果要修改,擴充,都直接修改類或者擴充類即可,不需要修改源代碼,擴充性非常好.
本文轉自 3147972 51CTO部落格,原文連結:http://blog.51cto.com/a3147972/1413619,如需轉載請自行聯系原作者