php中反射的作用

反射可以用于文档生成。因此可以用它对文件里的类进行扫描,逐个生成描述文档。

既然反射可以探知类的内部结构,那么是不是可以用它做hook实现插件功能呢?或者是做动态代理呢?

<?php

class mysql {
    function connect($db) {
        echo "连接到数据库${db[0]}\r\n";
    }
}

class sqlproxy {
    private $target;

    function __construct($tar) {
        $this->target[] = new $tar();
    }

    function __call($name, $arguments) {
        foreach ($this->target as $obj) {
            $r = new ReflectionObject($obj);
            if ($method = $r->getMethod($name)) {
                if ($method->isPublic() && !$method->isAbstract()) {
                    echo "方法前拦截记录LOG\r\n";
                    $method->invoke($obj, $arguments);
                    echo "方法后拦截\r\n";
                }
            }
        }
    }
}

$obj = new sqlproxy('mysql');
$obj->connect('member');

输出结果:

方法前拦截记录LOG
连接到数据库member
方法后拦截

这里简单说明一下,真正的操作类是mysql类,但是sqlproxy类实现了根据动态传入参数,代替实际的类运行,并且在方法运行前后进行拦截,并且动态地改变类中的方法和属性。这就是简单的动态代理。

本段内容摘录自书籍《PHP核心技术与最佳实践》

如果您觉得本文对您有用,欢迎捐赠或留言~
微信支付
支付宝

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注