• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP反射原理与用法深入分析

    本文实例讲述了PHP反射原理与用法。分享给大家供大家参考,具体如下:

    说到反射,实际上包含两个概念:

    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
        // used as resolvers for more fine-tuned resolution of these 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 = $reflector->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 these 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 use the reflection instances to make a
        // new instance of this class, injecting the created dependencies in.
        $instances = $this->resolveDependencies(
          $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 ' . $name;
      }
    }
    $hello = 'HelloWorld';
    $helloSay = 'sayHelloTo';
    $helloIntance = new $hello;
    echo $helloIntance->$helloSay('Mike');
    
    

    那么为什么还需要反射呢?

    更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

    希望本文所述对大家PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • PHP的反射动态获取类方法、属性、参数操作示例
    • php面试实现反射注入的详细方法
    • php提供实现反射的方法和实例代码
    • PHP进阶学习之反射基本概念与用法分析
    • php反射学习之不用new方法实例化类操作示例
    • PHP反射学习入门示例
    • PHP反射实际应用示例
    • 用PHP的反射实现委托模式的讲解
    • 浅析PHP类的反射来实现依赖注入过程
    • PHP基于反射机制实现自动依赖注入的方法详解
    • PHP基于反射获取一个类中所有的方法
    • PHP反射基础知识回顾
    上一篇:Windows服务器中PHP如何安装redis扩展
    下一篇:php实现的数组转xml案例分析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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