最新公告
  • 欢迎您光临蛙蛙应用,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • www.wawaapp.cn_PHP反射基础知识回首

     

    这篇文章主要先容了PHP 反射的相关资料,辅助人人回首和明白PHP的相关知识,感兴趣的同伙可以领会下

    反射是编程语言的高级特征,能在运行时让代码有感知代码的能力。PHP自5起支持反射机制,其是种种OOP框架底层实现的主要支持。

    反射

    从一个简朴的例子明白反射:人有五官四肢,但鲜有人清晰人体内部的经脉走向、骨骼组织。若是你修仙顺遂,在丹田深处练出元婴,那么就通过元婴透析身体内部的组织。明白内部组织后,还可以让元婴指引体内真气在经脉的流向,早日修成正果。

    如其名,反射是(从镜子里)照出自身。我们写代码,告诉代码怎么运行,事宜发生在编译期。代码运行时代,代码若何知道自己的结构以及能力呢?反射机制相当于代码的元婴,使代码能够感知自身结构,并可(部门)改变运行行为。

    与运行时类型信息(Runtime Type Informatiion, RTTI)差别,反射重点在运行时检测、感知、改变自身的结构和行为。反射是元编程(metaprogramming)的主要组成部门。

    PHP反射API

    反射不是语法剖析,不操作表达式、代码语句。反射获取的是代码的结构,即函数、类这些构件的结构。PHP中的反射API均以Reflection开头(接口Reflector除外),重点在函数和类两种结构。而函数可以看成类的成员函数(多一个隐式的this参数)或者静态成员函数(public类型),以是领会反射API可从类信息的ReflectionClass最先。

    ReflectionClass提供了以下获取类基本信息的接口:

    getProperties:获取成员变量/属性,返回一个ReflectionProperty数组;ReflectionProperty类中有对属性详细说明的API:是否默认属性(isDefault),是否私有属性(isPrivate)等。同时ReflectionClass还提供获取特定种别属性的API:getDefaultProperties,getStaticProperties;

    getConstants:获取类中界说的常量;

    getMethods:获取类中界说的方式,返回一个ReflectionMethod数组;ReflectionMethod将在下文解说;

    getInterfaces:获取类实现的接口;

    getParentClass:获取父类的ReflectionClass实例。

    在反射中,类、接口、特征不分居,以是ReflectionClass提供类型判断API:isInterface、isTrait。

    除了以上基本信息,ReflectionClass(包罗ReflectionMethod/ReflectionFunction)还提供了一些难以想象的能力:

    getDocComment:获取类的文档注释信息;

    getFilename:获取类界说的文件;

    getStartLine: 获取类界说的起始行号;

    getEndLine: 获取类界说的竣事行号;

    getModifiers:获取类界说的修饰符,其意义名字可通过Reflection::getModifierNames获得,例如:abstract,final。

    若是说前述的类结构信息可以通过现有的API获取(method_exits/property_exits等),上面列出的功效基本上只能通过反射API获取(PHP文件中界说的类而且知道界说文件,可以行使token_get_all获得相同效果,然则实现非常复杂)。这些行为发生在运行时代。由此可见反射API在剖析类结构信息功效上的壮大。

    除了ReflectionClass,ReflectionMethod和ReflectionFunction是另外反射中另外两个主要的类。函数(function)界说在类外部,方式(method)界说在类内部,两者实在同源,在反射API中有配合的父类:ReflectionFunctionAbstract。ReflectionFunctionAbstract有两者的大部门API,而且基本上是最主要的API。其中最值得关注的是其参数信息的API:getParameters。其获取函数的参数信息,返回一个ReflectionParameter数组。连系getParameters和ReflectionParameter,函数(方式)的结构基本上就清晰了。

    API操作

    知道人体组织和体内真气漫衍,你可以指导真气到手指,练成一阳指、六脉神剑、弹指神通、九阴白骨爪等;也可以让真气汇聚,打破任督二脉,开拓洞天;还可以逆转全身经脉,练成蛤蟆功…内省的利益可见一斑。

    反射让代码感知自身结构,有什么利益呢?反射API提供了三种在运行时对代码操作的能力:

    设置接见控制权:setAccessible。可获取私有的方式/属性。注重:setAccessible只是让方式/成员变量可以invoke/getValue/setValue,并不代表类界说的接见存取权限改变;

    挪用函数/方式:invoke/invokeArgs。配合获取函数参数的API,可以平安的传参和挪用函数,call_user_func(_array)的增强版;

    不依赖组织函数天生实例:newInstanceWithoutConstructor。

    以单例来说一下反射API的功效,单例类代码如下:

    # foo.php
    class Foo {
     private static $id;
     private static $instance;

     private function __construct() {
     ++ self::$id;
     fwrite(STDOUT, “construct, instance id: ” . self::$id . “\n”);
     }

     public static function getSingleton() {
     if (self::$instance === null) {
     self::$instance = new self();
     }
     return self::$instance;
     }
    }

    在Foo类中,组织函数是私有,获取实例只能通过getSingleton方式,而且获取到的是单例。但在反射API加持下,能获取多个实例:

    $instance1 = Foo::getSingleton();
    var_dump($instance1);

    $class = new ReflectionClass(“Foo”);
    $constructor = $class->getConstructor();
    if ((ReflectionProperty::IS_PUBLIC & $constructor->getModifiers()) === 0) {
     $constructor->setAccessible(true);
    }
    $instance2 = $class->newInstanceWithoutConstructor();
    $constructor->invoke($instance2);
    var_dump($instance2);

    # 剧本执行效果
    construct, instance id: 1
    object(Foo)#1 (0) {
    }
    construct, instance id: 2
    object(Foo)#4 (0) {
    }

    我们乐成的天生了两个实例,并挪用组织函数完成工具初始化。若是没有反射API,这险些是不可能完成的事情。

    除了这三种操作,反射API险些已无在运行时动态改变代码的行为。但作为动态语言,PHP内置了将数据转换成代码执行的能力(例如create_function/eval、动态函数名挪用)。而PHP的好基友JavaScript则可以随时在运行时改变随便函数的行为:

    PHP作为最好的语言,理应能做到在运行时动态增减/改变函数界说。这就需要用到另一个PHP焦点开发者“Dmitry Zenovich”打造的大杀器:runkit拓展。这部门内容不属于反射,加之本人领会不深,不再详述。

    对比

    整理一下反射API和函数式API在功效上的差异:

    www.wawaapp.cn_PHP反射基础知识回首插图

    www.wawaapp.cn_PHP反射基础知识回首插图1

    总结

    本文对PHP中的反射机制做了简要总结,并与在运行时获取代码信息的函数式API做了对比。纵然你token_get_all用得再熟练,preg_match等文本操作用得再随手,反射API仍有其独到一面,值得领会。如本人之前博文“PHP中的重载”所言,有了反射,function_exits/class_exits、call_user_func这些函数应该可以退休。然则考虑到兼容、使用便利、运行效率等因素,许多框架仍然依赖这些API。

    谢谢阅读,迎接指正!

    以上就是PHP反射知识回首的详细内容,更多关于PHP 反射的资料请关注剧本之家其它相关文章!

    泉源:剧本之家

    链接:https://www.jb51.net/article/195310.htm

    申请创业报道,分享创业好点子。,配合探讨创业新机遇!

    爱搬网
    蛙蛙应用 » www.wawaapp.cn_PHP反射基础知识回首
    • 603会员总数(位)
    • 868资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 479稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情