1、 钩子:如何产生的?
2、 钩子产生的东西被安放在哪里?
3、 安放之后 又是如何调用的?
4、 调用之后又是如何显示的?这里是否已经是一个完全的从钩子产生到被使用的全部过程?麻烦您给几个例子

解决方案 »

  1.   

    就是插件机制,任何一个成熟点的代码都会涉及到,实现各有不同,你可以找些代码来阅读下。
    原理其实很简单,比如你注册个新用户
    伪代码如下://表示引入user类型的插件,简单来说,user是个目录,目录下有特定规则的类文件名,include它们,实例化下。
    $plugin = & Factory::get('plugin','user');
    if(!$_POST['user_id'])
    {//添加注册用户
       //表示触发beforeUserRegister事件(预留钩子),也就是user目录下所有类文件里的beforeUserRegister方法,$_POST作为参数传进去.
        $re = $plugin->trigger('beforeUserRegister',array($_POST));
        //处理注册信息
        doRegister($_POST);
        //原理同上
        $re = $plugin->trigger('afterUserRegister',array($_POST));
    }插件有个问题是执行顺序的设定,有些用数据库(后台可管理,比如joomla),有些直接用文件.
    意思是,比如/plugin/user/ 目录下有2个插件文件,也就是上面代码中会触发的两个插件.
    它们是
    plug_check.php
    plug_auth.php
    它们内部的类名和文件名是挂钩的,这样才可以include文件的同时,实例化他们.当然你不用类文件的方式来实现插件也可以,只要你设计好一定的规范.
    plug_check.php:
    class PlugCheck extends Plugin
    {
      function beforeUserRegister($post){}
      function afterUserRegister($post){}
    }plug_auth.php:
    class PlugAuth extends Plugin
    {
      function beforeUserRegister($post){}
      function afterUserRegister($post){}
    }
    那么这时候问题就出来了,在处理注册之前,我是先触发plug_check.php文件的PlugCheck类的beforeUserRegister,还是先触发另外一个?这个就需要你去配置了.
      

  2.   

    2楼这么一说让我想起去年弄joomla的时候用到的一些插件,当时还没去深究.现在回忆下~~确实如此!插件所谓的钩子的常用的方式是数据库数据以及文件命名的规则(比如说文件名和文件内容中的类名相同).
      

  3.   

    至于1楼说的~~估计是理解成win平台的程序钩子问题!那个是c++用到的一块!
      

  4.   

    $hooks = array('log','mail','queue');    foreach ($hooks as $hook){
            if (function_exists( __FUNCTION__ . '_' . $hook)){
                call_user_func_array (__FUNCTION__ . '_' . $hook, func_num_args());
            }
        }