<?php
// 应用单例模式
// 建立相应的 plugins 文件夹,并建立 .php 文件放在里面
class plugin
{
    public $actions;
    public $filters;

private $plugin_dir;
    private static $instance;

public static function getInstance()
    {
        if(self::$instance == null)
        {
            self::$instance = new self;
        }
        return self::$instance;
    }

private function __construct()
    {
        $this->actions = $this->filters = array();
        $this->plugin_dir = dirname(__FILE__).'/plugins/';
    }

public function init()
    {

$dir_handle = opendir($this->plugin_dir);
        while($m = readdir($dir_handle))
        {
            if($m == '.' || $m == '..')
            {
                continue;
            }else
            {
                $n = $this->plugin_dir . $m;
                if(is_file($n))
                {
                    $f = $n;
                }else
                {
                    $f = $n . '/' . $m . '.php';
                }
                include($f);
            }
        }
        closedir($dir_handle);

}

public function do_action($action, $params = array())
    {
        $a = $this->actions[$action];
        $c = $a;
        if(is_callable($c))
        {
            call_user_func_array($c, $params);
        }

}

public function add_action($action, $callable)
    {
        $this->actions[$action] = $callable;
    }

public function add_filter($filter, $callable)
    {
        $this->filters[$filter] = $callable;
    }

public function apply_filter($filter, $params = array())
    {
        $c = $this->filters[$filter];
        if(is_callable($c))
        {
            call_user_func_array($c, $params);
        }
    }

}

global $pl;
$pl = plugin::getInstance();
$pl->init();

$pl->add_action("tfunc", 'hook'); //引用 pugins目录中的 hook函数而已
$pl->do_action('tfunc', array('aa', 'bb', 'cc'));
//结果为  array(0=>'aa', 1=>'bb', 2 => 'cc') 3表示3个参数

//其中 plugins 中的 函数为
/*
function hook($param = array())
{
    $num = func_num_args();
    $str = func_get_args();
    print_r($str);
    print_r($num);
}
*/

php hook 之简单例子的更多相关文章

  1. Hibernate4.2.4入门(一)——环境搭建和简单例子

    一.前言 发下牢骚,这段时间要做项目,又要学框架,搞得都没时间写笔记,但是觉得这知识学过还是要记录下.进入主题了 1.1.Hibernate简介 什么是Hibernate?Hibernate有什么用? ...

  2. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  3. spring mvc(注解)上传文件的简单例子

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  4. ko 简单例子

    Knockout是在下面三个核心功能是建立起来的: 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Declarative bindings) 模板 ...

  5. mysql定时任务简单例子

    mysql定时任务简单例子 ? 1 2 3 4 5 6 7 8 9     如果要每30秒执行以下语句:   [sql] update userinfo set endtime = now() WHE ...

  6. java socket编程开发简单例子 与 nio非阻塞通道

    基本socket编程 1.以下只是简单例子,没有用多线程处理,只能一发一收(由于scan.nextLine()线程会进入等待状态),使用时可以根据具体项目功能进行优化处理 2.以下代码使用了1.8新特 ...

  7. 一个简单例子:贫血模型or领域模型

    转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...

  8. SSDT Hook实现简单的进程隐藏和保护【转载】

    原文链接:http://www.blogfshare.com/ssdthook-hide-protect.html 原文作者:AloneMonkey SSDT Hook实现简单的进程隐藏和保护 Alo ...

  9. [转] 3个学习Socket编程的简单例子:TCP Server/Client, Select

    以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序.如果你能完全理解这3个例子,估计 ...

随机推荐

  1. CAS认证(2):认证过程

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  2. heritrix 相关

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  3. spring4使用websocket

    看到spring4的介绍上说已经支持websocket了,尝试了一下之后各种坑,不如servlet简单,写篇文章来讲解一下自己遇到的坑. 环境:tomcat8+spring4.1.6+jdk8+ngi ...

  4. dubbo资料

    http://blog.csdn.net/morning99/article/details/40426781http://blog.csdn.net/ruishenh/article/details ...

  5. careercup-数学与概率

    7.3 给定直角坐标系上的两条线,确定这两条线会不会相交. 解法: 此题有很多不确定的地方:两条线的格式是什么?两条线实为同一条怎么处理?这些含糊不清的地方最好跟面试官讨论一下. 下面将做出以下假设: ...

  6. ASP.NET 未被授权访问所请求的资源。请考虑授予 ASP.NET 请求标识访问此资源的权限

    开发了一个导入TXT文件的功能,执行过程中出错.提示:.....ASP.NET 未被授权访问所请求的资源.请考虑授予 ASP.NET 请求标识访问此资源的权限.ASP.NET 有一个在应用程序没有模拟 ...

  7. 导演类(CCDirector)

  8. Cookie中用户登录信息的提示

    public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpSe ...

  9. 过滤所有的HTML标签

    <script type="text/javascript"> var str = "<p style=color:#FF0000>恩恩,就是就是 ...

  10. python中关于正则表达式四

    []   用来暗示一个字符串集合, 1.在这个集合中:字符串可以被 独特列出,例如[amk]将会匹配'a','m'或者'k'. 2.字符串的范围可以被暗示通过给两个字符串和分开它们用一个'-':例如[ ...