【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

[转]PHP hook钩子类

转载 2015年07月06日 21:33:49

不多说什么,用于做插件,消息监听之类的东西,反正用处挺大的,不清楚的请移步看看百科知识

  当然,代码之后只有使用的测试,而没有删除的测试,各种问题自行解决吧,还有功能不强,理论上应该可以设置优先级才对,但是这里不行,不完善的原因吧。

  基本原理还是很简单的,用列表存储对应的调用函数或方法,然后执行的时候调用并且返回一下就行了。还有钩子的作用是修改数据,所以必须传递一个参数过去,即使你用不到任何参数,发送个null参数过去也是可以的,并非没有意义,而是有时候部分数据很难直接调用,要使用全局变量或者通过其他方式获取的时候,空值也是不错的,至于返回对象,这个也必须的。

先贴类代码。

<?php
namespace Core;
/**
 * 系统钩子
 * @author loveyu
 */
class Hook{
    /**
     * 用于存放对应的构造列表
     * @var array
     */
    private $_hook_list;

    /**
     * 构造方法
     */
    public function __construct(){
        // TODO: Implement __construct() method.
        $this->_hook_list = array();
    }

    /**
     * 添加一个钩子到系统
     * @param string   $name
     * @param callback $func
     */
    public function add($name, $func){
        if(!isset($this->_hook_list[$name])){
            $this->_hook_list[$name] = array();
        }
        if(is_array($func)){
            $this->_hook_list[$name][get_class($func[0]) . ":" . $func[1]] = $func;
        } else{
            $this->_hook_list[$name][$func] = $func;
        }
    }


    /**
     * 应用钩子,至少包含一个参数名
     * @param string $name   对应名称
     * @param mixed  $param1 第一个参数
     * @return mixed 返回调用的第一个参数
     */
    public function apply($name, $param1){
        if(isset($this->_hook_list[$name])){
            $args = array_slice(func_get_args(), 1);
            foreach($this->_hook_list[$name] as $v){
                $param1 = call_user_func_array($v, $args);
                $args[0] = $param1;
            }
        }
        return $param1;
    }

    /**
     * 移除对应的钩子
     * @param string          $name 钩子名称
     * @param callback|string $func 钩子对应的调用方法
     */
    public function remove($name, $func = ''){
        if(isset($this->_hook_list[$name])){
            if(empty($func)){
                unset($this->_hook_list[$name]);
            } else{
                if(is_array($func)){
                    if(isset($this->_hook_list[$name][get_class($func[0]) . ":" . $func[1]]))
                        unset($this->_hook_list[$name][get_class($func[0]) . ":" . $func[1]]);
                } else{
                    if(isset($this->_hook_list[$name][$func]))
                        unset($this->_hook_list[$name][$func]);
                }
            }
        }
    }
}
然后是测试代码。

<?php
/*
 * 系统钩子测试文件
 */
require("../core/hook.php");
$hook = new \Core\Hook();

/**
 * 回调函数
 * @param $data 默认输入数据,必须
 * @param $n1 附加数据,可选
 * @param $n2 附加数据,可选
 * @return string 返回数据,和$data类似
 */
function test_hook_callback($data, $n1, $n2){
    echo "Run at:" . __METHOD__ . "\n";
    return $data . "\n{" . $n1 . "[" . __METHOD__ . "]" . $n2 . "}";
}

/**
 * 测试类
 */
class test_hook_class{
    /**
     * 类方法回调函数
     * @param $data 默认输入数据,必须
     * @param $n1 附加数据,可选
     * @param $n2 附加数据,可选
     * @return string 返回数据,和$data类似
     */
    public function callback($data, $n1, $n2){
        echo "Run at:" . __METHOD__ . "\n";
        return $data . "\n{" . $n1 . "[" . __METHOD__ . "]" . $n2 . "}";
    }

    /**
     * 静态方法回调函数
     * @param $data 默认输入数据,必须
     * @param $n1 附加数据,可选
     * @param $n2 附加数据,可选
     * @return string 返回数据,和$data类似
     */
    public static function static_callback($data, $n1, $n2){
        echo "Run at:" . __METHOD__ . "\n";
        return $data . "\n{" . $n1 . "[" . __METHOD__ . "]" . $n2 . "}";
    }
}

//函数回调
$hook->add('test_hook', 'test_hook_callback');

//静态方法回调
$hook->add('test_hook', 'test_hook_class::static_callback');

//实例化类
$test_class = new test_hook_class();
//添加方法
$hook->add('test_hook', array($test_class, 'callback'));

//需要处理的数据
$data = "loveyu";

//执行回调函数,顺序为添加顺序,必须存在两个及以上参数
$data = $hook->apply('test_hook', $data, 1, 2);

//输出最终数据
echo "\n".$data;

接着是运行结果输出数据。

Run at:test_hook_callback
Run at:test_hook_class::static_callback
Run at:test_hook_class::callback

loveyu
{1[test_hook_callback]2}
{1[test_hook_class::static_callback]2}
{1[test_hook_class::callback]2}
举报

相关文章推荐

PHP的钩子实现解析

PHP编程的钩子实现,示例讲解和解释它们的作用,写了一个样板的钩子实现 钩子是编程里一个常见的概念,非常的重要。它使得系统变得非常容易拓展(而不用理解其内部的实现机理,这样可以减少很多工作量)。只要有...

PHP的HOOK

PHP 的 HOOK使用

php钩子函数

钩子函数定义: 钩子函数可以截获并处理其他应用程序的消息。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以...

drupal模块列表 drupal常用模块

1、drupal快速上手的commerce distro商城模块 http://drupal.org/project/commerce_kickstart 虽然commerce kickstart是一个好的入门,但仍然要花时间来设定才能用地上。因此今年内会大大更新到2.0,功能大跃进,安装后可比美其他电子商城如magento, oscommerce 等 2、页面标题设定

CSDN回帖得分大全(近两年)

√ <a href="http://topic.csdn.net/u/20100521/20/3bdb7123-7de4-4b19-ae5c-3

PHP中插件机制的一种实现方案

PHP中插件机制的一种实现方案 这篇文章的出发点是由于一朋友问我是否会插件,以及对插件机制是否理解,及其在PHP中的实现。我当时认为不就是一个功能的实现么,呵呵。想法很简单,在网上查了一下,才...

Winodws HOOK 之键盘钩子

钩子(HOOK)是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息或特定事件(比如键盘和鼠标事件等),而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。 以下是利用键盘钩子HOOK键盘操作的示例代码,实现了当捕获到键盘按键按下时会播放一段声音。 [cpp]</stro

HOOK钩子技术1 inline HOOK内联钩子

内联钩子改变函数的第一条指令,通过跳板跳到伪造的函数上。 函数在使用过程中有时候要执行本身已经挂钩的函数,这样就需要先解钩。

Android彻底退出应用程序

转于:http://www.eoeandroid.com/home.php?mod=space&amp;uid=588465&amp;do=blog&amp;id=2667   ---------------------------------------------------------------------------------------------------------------------------</p

php插件机制

插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发者实现),它的特点是:当你需要它的时候激活它,不需要它的时候禁用/删除它;且无论是激活还是禁用都不影响系统核心模块的运行,也就是说插件...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)