博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用反射给类中方法加钩子
阅读量:6824 次
发布时间:2019-06-26

本文共 1749 字,大约阅读时间需要 5 分钟。

有一个类如下所示:

 

class Test{    private $name = 'ok';    public function __beforePrintname()    {        echo '调用方法前';    }    public function printName()    {        echo 'ok';    }    public function __afterPrintname()    {        echo '调用方法后';    }}

  

我们希望在实例化后调用printName方法前能调用__beforePrintname,调用printName后能调用__afterPrintname;给这个方法前后都加一个钩子方法

我们可以使用反射来实现,代码如下:

class Proxy{    private $arrObject = [];    public function __construct($obj)    {        $this->arrObject[] = new $obj();    }    public function __call($name, $arguments)    {        foreach ($this->arrObject as $obj) {            $ref = new ReflectionClass($obj);            if ($method = $ref->getMethod($name)) {                if ($method->isPublic()) {                    // 调用方法前                    $beforeMethodName = '__before' . $name;                    if ($ref->hasMethod($beforeMethodName)) {                        $beforeMethod = $ref->getMethod($beforeMethodName);                        if ($beforeMethod->isPublic()) {                            $beforeMethod->invoke($obj, $arguments);                        }                    }                    // 调用方法                    $method->invoke($obj, $arguments);                    // 调用方法后                    $afterMethodName = '__after' . $name;                    if ($ref->hasMethod($afterMethodName)) {                        $afterMethod = $ref->getMethod($afterMethodName);                        if ($afterMethod->isPublic()) {                            $afterMethod->invoke($obj, $arguments);                        }                    }                }            }        }    }}

  

测试:

$test = new Proxy('Test');$test->printName();

  

输出:

调用方法前ok调用方法后

转载于:https://www.cnblogs.com/itfenqing/p/7056549.html

你可能感兴趣的文章
分形树的绘制
查看>>
loadrunner请求中有汉字 如何编码
查看>>
java数据结构 • 面向对象 • 异常 • 随机数·时间
查看>>
springmvc 实现pc端手机端适配(同一个请求根据不同客户端展示不同界面)
查看>>
BTree和B+Tree详解
查看>>
VS2005工程迁移到Eclipse CDT
查看>>
Linux高端内存映射(上)【转】
查看>>
usb_control_msg参数详解【转】
查看>>
8086汇编指令速查手册
查看>>
j2EE web.xml中的url-pattern的映射规则
查看>>
带输入输出参数的存储过程
查看>>
字符编码简介
查看>>
LevelDB源码之六缓存机制
查看>>
双向链表
查看>>
安装unity3d多个版本共存
查看>>
如何获取模拟器安装的app的位置
查看>>
[LeetCode] Largest Rectangle in Histogram 解题报告
查看>>
未能加载文件或程序集Newtonsoft.Json, Version=4.5.0.0
查看>>
国外服务器鸟文windows,时间12小时制,如何改成24小时呢?我来告诉你
查看>>
html里的<wbr>标签什么意思
查看>>