PHP外掛系統的實現(四):實現註冊動作

VeryCool發表於2021-06-15

註冊動作

到現在發現者的工作基本已經完成,我們需要讓員工自己選擇喜歡做的事情.

所以需要實現一個 register() 方法
首先需要思考一下注冊引數需要接收什麼引數?
既然是外掛系統 那麼就有鉤子這個概念,那麼加一個$hook形參.
註冊時候是不是需要將類中的方法傳遞過來放到函式中那麼我們定義一個$method.
現在有了 $hook and $method 總感覺缺點什麼,emmm….
好像沒類名,沒有類名的話有方法名沒用,那麼需要再加一個$class_name

其實在做的時候就已經構思了一下自己要實現的外掛的是個什麼樣子的,所以我將外掛入口做為一個類

  # $hook鉤子  $class_name類名  $method 方法名
  $class_name 需要引用 並方入
  public function register($hook, &$class_name, $method)
   {
           #獲取類名和方法名連結起來做下標
         $func_class = get_class($class_name).'->'.$method;
         #將類和方法放入監聽陣列中 以$func_class做下標
         $this->_staff[$hook][$func_class] = array(&$class_name, $method);

     }

註冊方法已經完成,但是如何呼叫呢?現在在外掛中是不可能進行呼叫的.所以我們需要在detector方法中將類傳過去

public function detector(){
        //主要功能為將外掛需要執行功能放入  $_staff
        $plugins  =  $this->get_active_plugins();

        if($plugins){
            foreach($plugins as $plugin){
                #這裡將所有外掛踐行初始化
                #路徑請自己注意
                if (@file_exists($plugin['path'])){
                    include_once($plugin['path']);
                    #此時設定 資料夾名稱 檔名稱 類名 是統一的 如果想設定不統一請自己在get_active_plugins()內進行實現
                    $class =  $plugin['name'];
                    if (class_exists($class)){
                        #初始化所有外掛類
                        #---------------------------
                        //new  $class();
                        #-----------改為----------------
                        new  $class($this); #將當前類傳過去 提供給外掛類引用

                    }
                }
            }
        }
    }

這個時候 外掛中就可以使用 register 這個方法了 到現在發現外掛->註冊外掛 已經完成的差不多了,接下來就是執行外掛

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章