<?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. eas bos 编辑界面 editUIt 属性值为空

    在编辑界面,我们可以正常的保存某个值到数据库,同时列表界面也可以正常显示. 但是当我们再次打开这个编辑界面的时候,该属性值缺无法显示. 通常情况下,通过下面两个方法可以解决 方法一: 在编辑界面重写一 ...

  2. 49. Sort Letters by Case

    最后更新 一刷 还是Partition,只不过这次是按照大小写字母来. public class Solution { public void sortLetters(char[] chars) { ...

  3. 转HTMLTestRunner 生成测试报告

    1.HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展.它生成易于使用的 HTML 测试报告 1>下载HTMLTestRunner.py文件,地址为: h ...

  4. 【面试虐菜】—— MongoDB知识整理

    为什么我们要使用MongoDB? 特点: 高性能.易部署.易使用,存储数据非常方便.主要功能特性有: 面向集合存储,易存储对象类型的数据. 模式自由. 支持动态查询. 支持完全索引,包含内部对象. 支 ...

  5. LINQ to JavaScript

    JSLINQ 是一个将LINQ对象转化为JavaScript对象的工具 .它是构建在JavaScript的数组对象的基础上进行转换的,如果您使用的是一个数组,你可以使用LINQ到javascript ...

  6. SQL rank() 用法

    WITH vep AS ( SELECT package.OrderCode , RANK() OVER ( PARTITION BY package.OrderCode ORDER BY packa ...

  7. 对Jsp提交input标签空格和回车的处理

    今天做增加的时候发现一个问题,在js中去掉空格的时候如果这么写 var stage_name = document.getElementById("stage_name").val ...

  8. Web内容禁止选中的两种方式

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/5761818. ...

  9. UWP入门一 7天酒店客户端源码及说明

    以前写过一个wp8的工程,说实话那会的代码很麻烦,写起来费劲,另外还没多少人下载,不过到windows 10 开始微软出了UWP架构以后一切都像以前的winform wpf一样好转起来,新建一个工程以 ...

  10. <转载>解决div里面img的缝隙问题

    转载自:http://blog.sina.com.cn/s/blog_9fd5b6df01013mld.html   练习切图时发现img和父级div之间总是有2px空隙(chrome),上网搜索解决 ...