反射可以用于文档生成。因此可以用它对文件里的类进行扫描,逐个生成描述文档。
既然反射可以探知类的内部结构,那么是不是可以用它做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核心技术与最佳实践》
如果觉得我的文章对您有用,请您随意打赏。您的支持将鼓励我更加努力创作!
如无特殊声明,文章均为原创,若有不正之处,万望告知。转载请附上原文地址,十分感谢!