国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

ThinkPHP3.2擴展

來源:懂視網(wǎng) 責編:小采 時間:2020-11-09 15:25:20
文檔

ThinkPHP3.2擴展

ThinkPHP3.2擴展:之前寫到TP3.1的行為擴展是tag();在TP3.2中引入了另一種說法—:鉤子。 我們來看一下TP3.2中的鉤子這個東西: 一:文件流程: 1:/index.php - require './ThinkPHP/ThinkPHP.php'; 2:/ThinkPHP/ThinkPHP.php—- require
推薦度:
導讀ThinkPHP3.2擴展:之前寫到TP3.1的行為擴展是tag();在TP3.2中引入了另一種說法—:鉤子。 我們來看一下TP3.2中的鉤子這個東西: 一:文件流程: 1:/index.php - require './ThinkPHP/ThinkPHP.php'; 2:/ThinkPHP/ThinkPHP.php—- require

之前寫到TP3.1的行為擴展是tag();在TP3.2中引入了另一種說法—:鉤子。 我們來看一下TP3.2中的鉤子這個東西: 一:文件流程: 1:/index.php - require './ThinkPHP/ThinkPHP.php'; 2:/ThinkPHP/ThinkPHP.php—- require CORE_PATH.'Think'.EXT; Think\Think:

之前寫到TP3.1的行為擴展是tag();在TP3.2中引入了另一種說法—:鉤子。
我們來看一下TP3.2中的鉤子這個東西:
一:文件流程:
1:/index.php ->require './ThinkPHP/ThinkPHP.php';
2:/ThinkPHP/ThinkPHP.php—->require CORE_PATH.'Think'.EXT; Think\Think::start();
3:/ThinkPHP/Library/Think/Think.class.php—–>App::run();
4:/ThinkPHP/Library/Think/App.class.php 。到這里基本流程就走完了,(這里不說細節(jié));

二:代碼:
1:看一下 App::run()方法:

 
 Hook::listen('app_init');
 App::init();
 
 Hook::listen('app_begin');
 // Session初始化
 if(!IS_CLI){
 session(C('SESSION_OPTIONS'));
 }
 // 記錄應用初始化時間
 G('initTime');
 App::exec();
 
 Hook::listen('app_end');
 return ;

其中的Hook::listen(”)就是用來執(zhí)行鉤子的,我們可以在app_init這個安插的位置用來獲取應用中安裝的插件。

看一下Hook::listen();

 @param @param mixed $params 傳入?yún)?shù)
 * @return void
 */
 static public function listen($tag, &$params=NULL) {
 if(isset(self::$tags[$tag])) {
 if(APP_DEBUG) {
 G($tag.'Start');
 trace('[ '.$tag.' ] --START--','','INFO');
 }
 foreach (self::$tags[$tag] as $name) {
 APP_DEBUG && G($name.'_start');
 $result = self::exec($name, $tag,$params);
 if(APP_DEBUG){
 G($name.'_end');
 trace('Run '.$name.' [ RunTime:'.G($name.'_start',$name.'_end',6).'s ]','','INFO');
 }
 if(false === $result) {
 // 如果返回false 則中斷插件執(zhí)行
 return ;
 }
 }
 if(APP_DEBUG) { // 記錄行為的執(zhí)行日志
 trace('[ '.$tag.' ] --END-- [ RunTime:'.G($tag.'Start',$tag.'End',6).'s ]','','INFO');
 }
 }
 return;
 }

其中關鍵是:self::exec($name, $tag,$params); 看一下exec的代碼:

 /**
 * 執(zhí)行某個插件
 * @param string $name 插件名稱
 * @param @param Mixed $params 傳入的參數(shù)
 * @return void
 */
 static public function exec($name, $tag,&$params=NULL) {
 if(false === strpos($name,'\\')) {
 // 插件(多個入口)
 $class = "Addons\\{$name}\\{$name}Addon";
 }else{
 // 行為擴展(只有一個run入口方法)
 $class = $name.'Behavior';
 $tag = 'run';
 }
 $addon = new $class();
 return $addon->$tag($params);
 }

最后還不是 new $class();進而return $addon->$tag($params); 又轉到了具體鉤子的代碼方法。其實就是我們原本的調用class的方法,只不過經(jīng)過別人的高度封裝了。

三:那么問題來了,這個鉤子有什么用呢? 怎么用?
這里以OneThink 的{:hook('AdminIndex')}為例,看一些別人是怎么用的。
在系統(tǒng)初始化到 Hook::listen('app_init'); 時,

array('Common\Behavior\InitHook')
);

一看就明白,無非就是讀取持久化的信息,放到緩存或是其他的方式

 // 行為擴展的執(zhí)行入口必須是run
 public function run(&$content){
 if(isset($_GET['m']) && $_GET['m'] === 'Install') return;

 $data = S('hooks');
 if(!$data){
 $hooks = M('Hooks')->getField('name,addons');
 foreach ($hooks as $key => $value) {
 if($value){
 $map['status'] = 1;
 $names = explode(',',$value);
 $map['name'] = array('IN',$names);
 $data = M('Addons')->where($map)->getField('id,name');
 if($data){
 $addons = array_intersect($names, $data);
 Hook::add($key,$addons);
 }
 }
 }
 S('hooks',Hook::get());
 }else{
 Hook::import($data,false);
 }
 }

當在程序執(zhí)行到{:hook(‘AdminIndex’)}時—>調用的是Hook::listen(‘AdminIndex’);
AdminIndex這個掛載點包含了三個插件:分別是:SiteStat, SystemInfo,DevTeam。
用一個循環(huán)來分別按順序執(zhí)行.

總結:鉤子其實就是起到一個掛載點的作用,這個鉤子掛在哪里,就可以在哪里執(zhí)行,內容或功能就是掛載插件或類庫的具體實現(xiàn)。這樣實現(xiàn)的代碼就有很大的靈活性,掛載點不變,掛的東西變量,功能也就相應的變化,是不是很靈活強大呀。


以上只屬于學習筆記,若有錯請指正。

聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

ThinkPHP3.2擴展

ThinkPHP3.2擴展:之前寫到TP3.1的行為擴展是tag();在TP3.2中引入了另一種說法—:鉤子。 我們來看一下TP3.2中的鉤子這個東西: 一:文件流程: 1:/index.php - require './ThinkPHP/ThinkPHP.php'; 2:/ThinkPHP/ThinkPHP.php—- require
推薦度:
標簽: 行為 之前 擴展
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 一级毛片不收费 | 国内精品视频 | 国产精久久一区二区三区 | 国产精品第十页 | 美女视频黄全免费的 | 久久久久国产精品美女毛片 | 成人a网 | 日韩在线二区 | 一级特黄牲大片免费视频 | 免费国产叼嘿视频大全网站 | 北条麻妃国产九九九精品视频 | 人成精品视频三区二区一区 | 免费观看a黄一级视频 | 在线观看亚洲一区 | 日韩精品免费观看 | 久久久久久久国产精品毛片 | 国产区精品在线 | 视频精品一区二区三区 | 国内精品在线视频 | 精品国产乱码久久久久久一区二区 | 国产精品国产精品国产专区不卡 | 国产成人亚洲综合一区 | 欧美精品啪啪 | 国产 日韩 在线 | 欧美日韩中出 | 欧美日韩国产亚洲一区二区三区 | 九九久久99综合一区二区 | 一区二区免费在线观看 | 免费一级a毛片在线播 | 国产区在线观看 | 成人国产精品视频 | 亚洲精品国产字幕久久vr | 久久精品国产国产精品四凭 | 精品日韩欧美一区二区三区 | 国产区最新 | 亚洲精品91| 午夜国产大片免费观看 | 在线播放真实国产乱子伦 | 一级特黄女毛毛片 | 欧美成人免费xxx大片 | 久久99精品久久久久久 |