PHP 反射之动态代理-php教程

资源魔 22 0
反射能够探知类的外部构造 能够用它做 hook 完成插件性能,或许做静态代办署理。

与反射相干

类以及工具相干的函数

get_object_vars
get_class_methods
get_class_vars
get_class
get_parent_class
method_exists
property_exists
trait_exists

反射相干的 API 类

reflectiontype
reflectionproperty
reflectionobject
reflectionfunction
reflectionmethod
reflectionexception
reflectionextension
reflectionparameter
reflectionfunctionabstract
reflectiongenerator
reflectionclass
reflectionclassconstant
reflectionzendextension

反射 API 性能更弱小,乃至能复原这个类的原型,包罗办法的拜访权限等

使用场景

一个是对工具进行调试,另外一个是猎取类的信息,通常有如下使用形式

文档天生 用它对文件里的类进行扫描,天生形容文档

插件开发 正在 MVC 以及插件开发中,常见应用反射

缺陷

反射的功能耗费也很年夜,普通状况下只管即便没有应用

会毁坏类的封装性,由于反射能够使本不该该暴露的办法或属性被强迫暴露了进去

实例

上面是一个行使反射特点,完成的简略的数据库静态代办署理

基于静态代办署理,能够有更多的设想空间,照实现阻拦器,属性办法添加,裁剪等等

class Mysql
{
    function connect($db){
         echo "connecting database ${db[0]}\r\n";
    }
}
class SqlProxy
{
    private $target;
     function __construct($tar){
         $this->target[]  = new $tar();
     }
     function __call($name, $args){
             if($method = $r->getMethod($name)){
                 if($method->isPublic() && !$method->isAbstract()){
                     echo "method before record \r\n";
                     $method->invoke($obj,$args);
                     echo "method after record\r\n";
                 }
             }
         }
     }
 }
 $obj = new SqlProxy('Mysql');
 $obj->connect('member');

其它

echo 与 print 都是言语构造,然而后者有前往值

print_r 以及 var_dump 是一般函数 皆可打印多品种型数据,但后者会输入数据类型,前者第二参数可扭转输入为前往

保举:《PHP教程》

以上就是PHP 反射之静态代办署理的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学

抱歉,评论功能暂时关闭!