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核心技术与最佳实践》
如果您觉得本文对您有用,欢迎捐赠或留言~
- 本博客所有文章除特别声明外,均可转载和分享,转载请注明出处!
- 本文地址:https://www.leevii.com/?p=897