首页 > 作文

PHP反射原理与用法深入分析

更新时间:2023-04-08 06:55:40 阅读: 评论:0

本文实例讲述了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 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图