上一节

上次我们讲到了系统完成了初始化,这一篇我们会更加深入typecho,同时会介绍typecho的插件机制。

插件点

热心的读者肯定会问,什么是插件点?当然你会不知道,因为这个名词是老高想出来的,本次要讲的插件机制的基础知识可以参考我的另一片博文thinkphp钩子的实现钩子这个词比较粗俗,其实高大上的叫法就是插件,而老高自创的插件点就是事件的意思。

index.php中Typecho_Plugin::factory('index.php')->begin(),其实就是通知挂载到'index.php'这个事件的插件可以执行了。

具体流程如下:

Typecho_Plugin::factory('index.php')返回了Typecho_Plugin的实例,构造函数中确定了唯一的句柄,即'index.php',紧接着执行了该实例的begin()方法,由于该方法不存在,所以调用了魔术方法__call,最后由__call方法执行所有在这个插件点挂载的插件。

__call方法源代码:

    public function __call($component, $args)
    {
        $component = $this->_handle . ':' . $component;
        $last = count($args);
        $args[$last] = $last > 0 ? $args[0] : false;
    
        if (isset(self::$_plugins['handles'][$component])) {
            $args[$last] = NULL;
            $this->_signal = true;
            foreach (self::$_plugins['handles'][$component] as $callback) {
                $args[$last] = call_user_func_array($callback, $args);
            }
        }
    
        return $args[$last];
    }

关键点:

  • __call是可以带参数的
  • $callback是二位数组,一个类名,一个方法名
  • 在该类init方法中,activated和handles是分开保存的,因为activated以插件名做键名,而handles以插件点为键,目的不同
  • 插件的关联信息保存在数据库中typecho_options表中的plugins
  • 需要禁用再启用才能使修改后的插件生效

当完成了第一个插件点的挂载后,程序开始路由分发。

下一节

码字不易,转载请注明出处。

标签: typecho, source code, plugin

已有 6 条评论

  1. oreax oreax

    老高,问一下,模板文件中到处可见的$this->,是指代啥?

    1. 学好了以后可以自己写

    2. 你想做什么?

    3. 一般来说,指的是这个类 Widget_Archive

    4. oreax oreax

      多谢! 另外:问一下,要在这些类中,或者Widget_Contents_Post_Admin.php这种文件中输出临时变量的的值,怎么输出?

    5. adfasdf adfasdf

      学习php,尝试改成个cms

添加新评论