理解ThinkPHP中的CBD“核心+行爲+驅動”中的行爲 Behavior

可以理解爲一個函數的指針指向了別的地方的函數。
如果學過C++可以用這個一個例子來解釋:
#include<iostream>
using namespace std;
void fun_behavior_1(){
cout<<"behavior_1_body"<<endl;
}
void fun_behavior_2(){
cout<<"behavior_2_body"<<endl;
}
class A{
private:
void (*behavior_1)();
void (*behavior_2)();
void (*behavior_3)();
public:
A(){
//init
behavior_1 = NULL;
behavior_2 = NULL;
behavior_3 = NULL;
//from somewhere to get the behavior_1 and behavior_2's function body.
behavior_1 = (fun_behavior_1);
behavior_2 = (fun_behavior_2);
//also, behavior_3 is not found
}
void run(){
if(behavior_1){
behavior_1();
}
if(behavior_2){
behavior_2();
}
if(behavior_3){
behavior_3();
}
}
};


int main(){
A a;
a.run();
}
所以 在thinkphp中的行爲也類似於這樣。定義好了函數的指針(就是tags數組的的key)
然後來調用key對應的value所描述的行爲函數。
用更簡單的例子來說明就是(PHP):
class A{
function Behavior_1(){
echo "behavior_1";
}
function Behavior_2(){
echo "behvior_2";
}
function doSomething(){
echo "doSomething, code by yourself";
}
function run(){
Behavior_1();
doSomething();
Behavior_2();
}
}
A a = new A();
a->run();


這裏的Behavior_1 Behavior_2函數可以改成自己的代碼,就類似與自己指定,不指定的話 就執行默認的。
doSomething 就是在兩個Behavior中間的函數,類似與action_begin 和action_end中間的action。


官方文檔上也說明了類似於java中的aop思想。
3.1.2的文檔中包含了
app_init 應用初始化標籤位
path_info PATH_INFO檢測標籤位
route_check 路由檢測標籤位
app_begin 應用開始標籤位
action_name 操作方法名標籤位
action_begin 控制器開始標籤位
view_begin 視圖輸出開始標籤位
view_template 視圖模板解析標籤位
view_parse 視圖解析標籤位
view_filter 視圖輸出過濾標籤位
view_end 視圖輸出結束標籤位
action_end 控制器結束標籤位
app_end 應用結束標籤位
這幾種默認的。就是類似與上面的函數指針。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章