插件用的類別

完整內容與範例請看:
http://blog.pixnet.net/HACGIS/post/15612808
abstract class _插件{
    private $_方法 = array();
    private $_插件 = array();

    function __construct(&$插件 = null){
        $this->__插件($插件);
    }

    final function __call($方法, $參數){
        return call_user_func_array($this->_方法[$方法], $參數);   
    }

//    將插件的方法加入$this的方法中
    final protected function __插件(&$插件, $更新 = false){
        static $類別 = __CLASS__;
        if (false === $插件) {
            $this->_插件 = array();
            $this->_方法 = array();
            return;       
        }
        if (false == is_object($插件)) {
            return;
        }
        $名稱 = get_class($插件);
        if (false == ($插件 instanceof $類別) || array_key_exists($名稱, $this->_插件)) {
            return;
        }
        $this->_插件[$名稱] = $插件;
        $this->_方法 = $插件->__方法() + $this->_方法;
        if ($更新) {
            $this->__更新();
        }
        if (is_callable($this, '_插件')) {
            $this->_插件($插件);
        }
    }

//    取得插件的方法(除了方法名稱開頭是'__'的方法,例如一些魔術方法,或是方法本身屬於私有方法)
    final protected function &__方法(){
        $反映 = new ReflectionObject($this);
        $方法 = $反映->getMethods();
        unset($反映);
        $輸出 = array();
        foreach ($方法 as &$項目){
            $名稱 = &$項目->getName();
            if (0 !== strpos($名稱, '__') && false == $項目->isPrivate()) {
                $輸出[$名稱] = array($this, $名稱);
            }
        }
        return $輸出; 
    }
   
//    更新所有插件的方法,通常在載入所有插件後調用
    final protected function __更新(){
        static $類別 = __CLASS__;
        foreach ($this->_插件 as &$插件){
            if($插件 instanceof $類別) {
                $插件->_方法 = $this->_方法 + $插件->_方法;
            }
        }
    }
   
}


原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=3280
Sign In or Register to comment.