• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答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擴展

    來源:懂視網 責編:小采 時間: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 。到這里基本流程就走完了,(這里不說細節);

    二:代碼:
    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(”)就是用來執行鉤子的,我們可以在app_init這個安插的位置用來獲取應用中安裝的插件。

    看一下Hook::listen();

     @param @param mixed $params 傳入參數
     * @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 則中斷插件執行
     return ;
     }
     }
     if(APP_DEBUG) { // 記錄行為的執行日志
     trace('[ '.$tag.' ] --END-- [ RunTime:'.G($tag.'Start',$tag.'End',6).'s ]','','INFO');
     }
     }
     return;
     }

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

     /**
     * 執行某個插件
     * @param string $name 插件名稱
     * @param @param Mixed $params 傳入的參數
     * @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的方法,只不過經過別人的高度封裝了。

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

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

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

     // 行為擴展的執行入口必須是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);
     }
     }

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

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


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

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。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
    主站蜘蛛池模板: 精品国产乱码久久久久久1区2区 | 国产精品亚洲αv天堂无码| 青青青青久久精品国产h久久精品五福影院1421| 日韩精品专区在线影院重磅| 国产在线精品一区二区不卡麻豆 | 91探花国产综合在线精品| 久久精品aⅴ无码中文字字幕重口| 国产香蕉国产精品偷在线| 国产精品久久久久久福利漫画| 亚洲人成电影网站国产精品| 国产乱码精品一区二区三| 国产精品福利一区二区| 久久精品aⅴ无码中文字字幕不卡| 欧美亚洲成人精品| 国产精品va在线观看无码| 精品国产欧美另类一区| 国产精品女同一区二区| 无码日韩精品一区二区免费| 日本Aⅴ大伊香蕉精品视频| 国产一级精品高清一级毛片| 88国产精品欧美一区二区三区| 国产成人精品高清在线观看99| 精品福利视频一区二区三区| 亚洲国产另类久久久精品黑人| 久久久久无码精品| 国语自产精品视频| 国产精品第一页在线| 91精品国产福利在线观看麻豆| 国产a视频精品免费观看| 国产成人无码精品一区二区三区| 人人妻人人澡人人爽人人精品电影 | 午夜精品久视频在线观看| 99久久婷婷免费国产综合精品| 国产午夜无码精品免费看动漫| 少妇人妻无码精品视频| 一本一本久久A久久综合精品| 亚洲国产av无码精品| 亚洲А∨精品天堂在线| 亚洲人午夜射精精品日韩| 亚洲精品成人网站在线观看| 亚洲AV无码精品无码麻豆|