亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

thinkphp(php)插件鉤子(hooks)分析的簡(jiǎn)單實(shí)現(xiàn)機(jī)制

 更新時(shí)間:2023年03月20日 16:50:57   投稿:yin  
現(xiàn)在主流的cms或者blog等系統(tǒng)中,都內(nèi)置的有插件系統(tǒng),但是層層深入、剖析實(shí)現(xiàn)的方式,其實(shí)都是最簡(jiǎn)單的鉤子的復(fù)雜化的實(shí)現(xiàn)。這篇文章主要介紹了thinkphp(php)插件鉤子(hooks)分析的簡(jiǎn)單實(shí)現(xiàn)機(jī)制,需要的朋友可以參考下

現(xiàn)在主流的cms或者blog等系統(tǒng)中,都內(nèi)置的有插件系統(tǒng),但是層層深入、剖析實(shí)現(xiàn)的方式,其實(shí)都是最簡(jiǎn)單的鉤子的復(fù)雜化的實(shí)現(xiàn)。

前言

鉤子是插件執(zhí)行的觸發(fā)器;插件就像掛在鉤子上的東西;插件只有實(shí)現(xiàn)相應(yīng)鉤子方法,并安裝啟用成功后才能執(zhí)行。

開(kāi)發(fā)者也可以用hook('test')方法在控制器只加入鉤子,讓你的應(yīng)用具有更好的擴(kuò)展性;同時(shí)也可以模板里加入鉤子{:hook('footer')};鉤子也支持傳入?yún)?shù)hook('footer',array('test'=>1));

向系統(tǒng)暴露你的鉤子,就是把你的鉤子在相應(yīng)的文件里列出來(lái),系統(tǒng)會(huì)來(lái)檢測(cè)。

{:hooks('documentDetailAfter')}

這個(gè)的意思就是:相當(dāng)于在這邊 打一個(gè)點(diǎn) ,我們可以將插件掛載到那
官方的說(shuō)法是:文檔末尾顯示顯示的 鉤子
意思就是說(shuō),在文檔末尾的時(shí)候,會(huì)自動(dòng)調(diào)用掛載在那個(gè) 鉤子 上的插件

舉例說(shuō)明

php中所謂的鉤子,其實(shí)就是一種事件驅(qū)動(dòng),主要分為‘注冊(cè)事件’、‘觸發(fā)事件’兩步。所謂‘注冊(cè)事件’,即目的是給未來(lái)可能發(fā)生的'事情'起一個(gè)名字,名字,可以用單例模式或者注冊(cè) 為一個(gè)全局的變量,用的時(shí)候直接在對(duì)應(yīng)的方法或者類(lèi)再或者函數(shù)中插入這個(gè)變量即可;‘觸發(fā)事件’,本質(zhì)上就是在事件的全局變量中查詢(xún)要觸發(fā)的時(shí)間名稱(chēng),然后找到注冊(cè)號(hào)的類(lèi)與方法,實(shí)例化運(yùn)行。
舉個(gè)例子來(lái)說(shuō)明一下。
項(xiàng)目經(jīng)理給我們了如下的需求:
第一天:開(kāi)發(fā)注冊(cè)的功能。
程序員巴拉巴拉,三下五除二就完成了。
第二天:在注冊(cè)前添加發(fā)送短信驗(yàn)證碼的功能。
程序員巴拉巴拉,三峽五除二就又完成了。
第三天:注冊(cè)完成之后,給用戶(hù)添加相應(yīng)的積分。
程序員又開(kāi)始巴拉巴拉ing……

    class Register{
        public function index(){
            /**
             * 第二天發(fā)送短信功能
             */
            
            /**
             * 第一天注冊(cè)代碼
             */
            
            /**
             * 第三天增加積分功能 
             */
        }
    }

這樣一個(gè)人開(kāi)發(fā)還好,多個(gè)人開(kāi)發(fā),勢(shì)必會(huì)造成配合麻煩的問(wèn)題,同時(shí)代碼也會(huì)變得混亂。

作為優(yōu)秀程序員的我們,當(dāng)然不容許我們程序中代碼冗余、混亂的出現(xiàn),于是我們把方法寫(xiě)成函數(shù)獨(dú)立出來(lái),方便調(diào)用與代碼簡(jiǎn)介。于是形成如下代碼:

    class Register{
        public function index(){
            /**
             * 第二天發(fā)送短信功能
             */
             sendMsg($data);
            /**
             * 第一天注冊(cè)代碼
             */
            
            /**
             * 第三天增加積分功能 
             */
            sendIntegral($data);
        }
    }
    /**
     * 發(fā)送短信
     * @param  {[type]} $data [description]
     * @return {[type]}       [description]
     */
    function sendMsg($data){
        /*
                balabala
         */
    }
    /**
     * 贈(zèng)送積分
     * @param  {[type]} $data [description]
     * @return {[type]}       [description]
     */
    function sendIntegral($data){
        /*
                balabala
         */
    }

但是我們想要把程序開(kāi)元出去讓更多的人參與,這種直接修改源碼碼的方式始終不是太好,這個(gè)時(shí)候,我們就可以使用鉤子的方式,在注冊(cè)成功前后注冊(cè)兩個(gè)鉤子,我們只需要把鉤子告訴開(kāi)發(fā)人員就行了,這樣他們不用改變?cè)创a碼就可以輕易的進(jìn)行拓展。

    class Register{
        public function index(){
            
            //注冊(cè)前鉤子
            Hook::run('registerBefore');
            /**
             * 注冊(cè)代碼
             */
            
            //注冊(cè)后鉤子
            Hook::run('registerAfter');
        }
    }

鉤子的簡(jiǎn)單實(shí)現(xiàn)代碼

目錄結(jié)構(gòu):../hook/Hook.php

鉤子核心類(lèi)Hook.php:

    <?php
    
    namespace hook;
    class Hook{
        
        static protected $hook = [];
        
        /**
         * 插件注冊(cè)
         * @param [type] $name   [description]
         * @param [type] $addons [description]
         */
        static public function add($name,$addons){
            self::$hook[$name] = $addons;
        }
        /**
         * 插件執(zhí)行
         * @param  [type] $name [description]
         * @return [type]       [description]
         */
        static public function run($name){
            if(isset(self::$hook[$name])){
                $method = (new self::$hook[$name]());
                   call_user_func([$method,$name]);
            }
            
        }
    }

簡(jiǎn)單的插件demo:

    <?php
    namespace addons\demo;
    class Demo{
        public function registerBefore(){
            echo 'registerBefore'.'</br>';
        }
        public function registerAfter(){
            echo 'registerAfter'.'</br>';
        }    
    }

插件實(shí)現(xiàn)的地方,即上文的注冊(cè)的文件:

    <?php
    namespace index\controller;
    use hook\Hook;
    class Index{
        public function index(){
            Hook::run('registerBefore');
            echo '注冊(cè)完成'.'</br>';
            Hook::run('registerAfter');
            
        }
    }

入口文件index.php

    <?php
    use index\controller\Index;
    spl_autoload_register('autoload');
    function autoload($name){
        require_once('/'.str_replace('\\','/',$name).'.php');
    }
    //插件注冊(cè)
    hook\Hook::add('registerBefore','\\addons\\demo\\Demo');
    hook\Hook::add('registerAfter','\\addons\\demo\\Demo');
    //調(diào)用
    $index = new Index();
    $index->index();

運(yùn)行接口如下:

  •     registerBefore
  •     注冊(cè)完成
  •     registerAfter

如果要添加新的功能,程序員只要修改demo的插件就可,如果要拓展新的功能,只需要拓展registerBefore和registerAfter即可。 

總結(jié)

可以說(shuō),鉤子就是掛載點(diǎn)。

掛載點(diǎn):在系統(tǒng)中提供給你一個(gè)掛載點(diǎn),我們可以進(jìn)行插件開(kāi)發(fā),開(kāi)發(fā)完成后,我們將其掛載到 掛載點(diǎn)上,會(huì)自動(dòng)調(diào)用執(zhí)行。

到此這篇關(guān)于thinkphp(php)插件鉤子(hooks)分析的簡(jiǎn)單實(shí)現(xiàn)機(jī)制的文章就介紹到這了,更多相關(guān)php插件鉤子(hooks)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論