专栏首页企鹅号快讯PHP高级特性之反射

PHP高级特性之反射

反射-Reflection

面向对象编程中对象被赋予了自省的能力,而这个自省的过程就是反射。 反射,直观理解就是根据到达地找到出发地和来源。比如,一个光秃秃的对象,我们可以仅仅通过这个对象就能知道它所属的类、拥有哪些方法。 反射是指在PHP运行状态中,扩展分析PHP程序,导出或提出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能称为反射API。

如何使用反射API

现在,要获取这个student对象的方法和属性列表该怎么做呢?如以下代码所示:

也可以不用反射API,使用class函数,返回对象属性的关联数组以及更多的信息:

假如这个对象是从其他页面传过来的,怎么知道它属于哪个类呢?一句代码就可以搞定:

反射API的功能显然更强大,甚至能还原这个类的原型,包括方法的访问权限等,如:

输出如下:

不仅如此,PHP手册中关于反射API更是有几十个,可以说,反射完整地描述了一个类或者对象的原型。反射不仅可以用于类和对象,还可以用于函数、扩展模块、异常等。

反射有什么作用

反射可以用于文档生成。因此可以用它对文件里的类进行扫描,逐个生成描述文档。

既然反射可以探知类的内部结构,那么是不是可以用它做hook实现插件功能呢?或者是做动态代理呢?

例如:

在平常开发中,用到反射的地方不多:一个是对对象进行调试,另一个是获取类的信息。在MVC和插件开发中,使用反射很常见,但是反射的消耗也很大,在可以找到替代方案的情况下,就不要滥用。

PHP有Token函数,可以通过这个机制实现一些反射功能。从简单灵活的角度讲,使用已经提供的反射API是可取的。

很多时候,善用反射能保持代码的优雅和简洁,但反射也会破坏类的封装性,因为反射可以使本不应该暴露的方法或属性被强制暴露了出来,这既是优点也是缺点。

更多分享,敬请关注

本文来自企鹅号 - PHP技术大全媒体

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java反射札记

    Java反射相关内容,在阅读一些开源框架和自己动手封装逻辑时常要用到,以前陆陆续续地看到过一些文章,但是最终留下的是破碎的代码片段和类名,所以这次重新敲一遍反射...

    企鹅号小编
  • 6个小场景告诉你,人工智能手机将怎么改变人类生活

    以前:闹钟准时响起铃铃铃... ? 现在:智能手机个性化定制闹钟,想赖床还可以让闹钟延时响起。 未来:人工智能手机根据日程灵活安排主人闹钟,比如:7:30闹钟响...

    企鹅号小编
  • 人工智能机器人手机

    宇飞来机器人手机是一款全球科技含量最高的手机,它具有以下几点优势: 1 超大内存:用过智能手机的人都知道,如果手机内存太小,你多运行几个软件、多存储一点照片,手...

    企鹅号小编
  • To be a Literature and Art Programmer

    lzugis
  • 【优雅代码】深入浅出 妙用Javascript中apply、call、bind

    Sb_Coco
  • Java中反射学习系列教程之一

    在上一个系列教程-《Java中注解学习系列教程》中解析自定义注解的时候用到了Java中一种技术--反射。其实在很多源码中,我们都能看到反射的身影。那么什么是反射...

    凯哥Java
  • 程序员奶爸的心路历程:如何在一年内获得五项开发者认证和第二学位

    原作者 Beau Carnes 编译 CDA 编译团队 本文为 CDA 数据分析师原创翻译作品,转载需授权 前言 工作和家庭难以兼顾吗?美国程序员小哥实力演绎如...

    CDA数据分析师
  • Linux命令(26)——rename命令

    功能类似于mv,可实现文件或者目录的重命名,mv不能批量处理,而rename可以。

    Dabelv
  • emlog为友链加上ico图标

    Youngxj
  • 现代控制理论思考题----倒立摆小车控制算法研究

    zhangrelay

扫码关注云+社区

领取腾讯云代金券