钩子实现

  • 2019-09-28
  • 38
  • 0
<?php

class hook
{
    private static $_hooks = [];

    /**
     * 添加一个钩子
     *
     * @param $hook
     * @param $func
     * @return bool
     */
    public static function add_hook($hook, $func)
    {
        $hook = strtolower($hook);
        if ( !self::exists_hook($hook) )
        {
            self::$_hooks[$hook] = [];
            if (is_callable($func))
            {
                self::$_hooks[$hook][] = $func;
                return true;
            }
        }
        return false;
    }

    /**
     * 检测是否已经存在钩子
     *
     * @param $hook
     * @return bool
     */
    public static function exists_hook($hook)
    {
        return isset(self::$_hooks[strtolower($hook)]) ? true : false;
    }

    /**
     * 触发钩子
     *
     * @param $hook
     * @param null $params
     * @return bool
     */
    public static function trigger_hook($hook, $params = null)
    {
        $hook = strtolower($hook);
        foreach (self::$_hooks[$hook] as $func)
        {
            if (is_array($params))
            {
                call_user_func($func, $params);
            }
            else
            {
                call_user_func($func);
            }
            return true;
        }
        return false;
    }

    /**
     * 获取钩子下注册的方法
     *
     * @param $hook
     * @return mixed|null
     */
    public static function get_hook_func($hook)
    {
        return isset(self::$_hooks[$hook]) ? self::$_hooks[$hook] : null;
    }


}

/**
 * 快捷函数
 */
function add_action($hook, $function)
{
    return hook::add_hook($hook, $function);
}

function do_action($hook)
{
    return hook::trigger_hook($hook);
}

// 使用方式

//simple_hook::add_hook('unique_name_hook','some_class::hook_test');
//或使用快捷函数添加钩子:
add_action('unique_name_hook','other_class::hello');

//执行钩子
do_action('unique_name_hook');

评论

还没有任何评论,你来说两句吧

粤ICP备17155863号

- 友情链接 - Theme by Qzhai