本文实例讲述了php反射原理与用法。分享给大家供大家参考,具体如下:
说到反射,实际上包含两个概念:
检视 introsp中秋遇上国庆双节祝福语ection 判断类、方法是否存在,父子类关系,调用关系等,检视的函数反射 reflection 获取类里的方法、属性,注释等,反射类的php官方文档写得很清晰了,下面我就说一下具体的应用。
1.参数检测
有时候需要在函数里需要判断传入的参数类型是否合法。
这时可以使用is_a、is_subclass_of来检测。或者结合反射,做更多检测。
2.动态调用
在依赖注入中,常见到这种用法,比如laravel5.5中的container.php
public function build($concrete) { // if the concrete type is actually a closure, we will just execute it and // hand back the results of the functions, which allows functions to be // ud as resolvers for more fine-tuned resolution of the objects. if ($concrete instanceof closure) { return $concrete($this, $this->getlastparameteroverride()); } $reflector = new reflectionclass($concrete); // if the type is not instantiable, the developer is attempting to resolve // an abstract type such as an interface of abstract class and there is // no binding registered for the abstractions so we need to bail out. if (! $reflector->isinstantiable()) { return $this->notinstantiable($concrete); } $this->buildstack[] = $concrete; $constructor = $refltvb经典台词ector->getconstructor(); // if there are no constructors, that means there are no dependencies then // we can just resolve the instances of the objects right away, without // resolving any other types or dependencies out of the containers. if (is_null($constructor)) { array_pop($this->buildstack); return new $concrete; } $dependencies = $constructor->getparameters(); // once we have all the constructor's parameters we can create each of the // dependency instances and then u the reflection instances to make a // new instance of this class, injecting the created dependencies in. $instances = $this->r卡巴斯基杀毒怎么样esolvedependencies( $dependencies ); array_pop($this->buildstack); return $reflector->newinstanceargs($instances); }
上述代码先判断是否是闭包,如果是,直接返回。不是则通过new reflectionclass($concrete);
生成反射类的实例,然后获取这个类的构造函数和参数,进行初始化的过程。
注意
反射里一个比较重要的用法invoke
当已知这个类的时候,可以通过构造reflectionmethod来直接调用,如:
class helloworld { public function sayhelloto($name) { return 'hello ' . $name; }}$reflectionmethod = new reflectionmethod('helloworld', 'sayhelloto');echo $reflectionmethod->invoke(new helloworld(), 'mike');
当不知道这个类时,知道类的对象,可以用reflectionobject获取reflectionmethod后调用,如:
class helloworld { public function sayhelloto($name) { return 'hello ' . $name; }}$hello = new helloworld();$refobj = new reflectionobject($hello);$refmethod = $refobj->getmethod('sayhelloto');echo $refmethod->invoke($hello,'mike');
调用流程一般就是获取反射类reflectionclass/反射对象reflectionobject的实例,然后获取reflectionmethod后,invoke。
3.获取注释,生成文档
比如phpdoc
4.注解,增强版的注释,符合一定的规则
比如某些框架的路由,便是通过注解实现的。
5.不要为了反射而反射
php是一门动态语言,其实可以直接通过字符串来调用类或函数,如下:
class helloworld { public function sayhelloto($name) { return 'hello ' . $na新疆招生网官网me; }}$hello = 'helloworld';$hellosay = 'sayhelloto';$hellointance = new $hello;echo $hello百合花的寓意intance->$hellosay('mike');
那么为什么还需要反射呢?
功能更强大更安全,防止直接调用没有暴露的内部方法可维护,直接写字符串是硬编码本文发布于:2023-04-08 06:55:38,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/c22a58ccf243af2684eb8d0bd3c0213a.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:PHP反射原理与用法深入分析.doc
本文 PDF 下载地址:PHP反射原理与用法深入分析.pdf
留言与评论(共有 0 条评论) |