php 的反射详解及示例代码


Posted in PHP onAugust 25, 2016

 最近在看java编程思想,看到类型信息这一章,讲到了类的信息以及反射的概念。顺便温故一下php的反射东西。手册是这样说的:"PHP 5 具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。 此外,反射 API 提供了方法来取出函数、类和方法中的文档注释。"当然手册上说的有些抽象!所谓的逆向说白就是能获取关于类、方法、属性、参数等的详细信息,包括注释! 文字总是那么枯燥,举个例子

class Foo {
  public  $foo = 1;
  protected $bar = 2;
  private  $baz = 3;
  
  /**
   * Enter description here ...
   */
  public function myMethod()
  {
    echo 'hello 2b';
  }
}

$ref = new ReflectionClass('Foo');
$props = $ref->getProperties();
foreach ($props as $value) {
  echo $value->getName()."\n";
}

//output
//foo 
//bar
//baz

ReflectionClass 这个类返回时某个类的相关的信息,比如 属性,方法,命名空间,实现那些接口等!上个例子中ReflectionClass:: getProperties 返回是 ReflectionProperty 对象的数组。

ReflectionProperty 类报告了类的属性的相关信息。比如  isDefault isPrivate  isProtected isPublic isStatic等,方法getName 是获取属性的名称!

以上是获取属性的,还有获取类方法的比如

class Foo {
  public  $foo = 1;
  protected $bar = 2;
  private  $baz = 3;
  
  /**
   * Enter description here ...
   */
  public function myMethod()
  {
    echo 'hello 2b';
  }
}

$ref = new ReflectionClass('Foo');
$method = $ref->getMethod('myMethod');
$method->invoke($ref->newInstance());

ReflectionClass::getMethod 是反是一个 ReflectionMethod 类型 ,ReflectionMethod 类报告了一个方法的有关信息,比如 isAbstract isPrivate  isProtected isPublic isStatic   isConstructor,还有一个重要的方法Invoke,InvokeArgs 就是执行方法!

其他的对象可以看看手册,不是很难!

那反射究竟有哪些用途?

反射是一个动态运行的概念,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。还可构建模式,比如动态代理。在一些php框架中使用反射也是很经常,比如kohana,yii,下面是kohana 的实现mvc的代码,就是用到了反射!

// Start validation of the controller
$class = new ReflectionClass(ucfirst(Router::$controller).'_Controller');
// Create a new controller instance
$controller = $class->newInstance();
// Load the controller method
$method = $class->getMethod(Router::$method);
// Execute the controller method
$method->invokeArgs($controller, $arguments);

上面的代码可以清晰看到这个框架的流程!通过Router 其实就处理url的类,通过Router可以获取哪个控制器、哪个方法!然后再执行方法!

以上就是对PHP 反射的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

PHP 相关文章推荐
社区(php&&mysql)五
Oct 09 PHP
PHP读MYSQL中文乱码的解决方法
Dec 17 PHP
ie6 动态缩略图不显示的原因
Jun 21 PHP
用mysql触发器自动更新memcache的实现代码
Oct 11 PHP
通俗易懂的php防注入代码
Apr 07 PHP
PHP获取MAC地址的函数代码
Sep 11 PHP
CodeIgniter框架提示Disallowed Key Characters的解决办法
Apr 21 PHP
php获取文件后缀的9种方法
Mar 22 PHP
PHP使用token防止表单重复提交的方法
Apr 07 PHP
PHP实现上一篇下一篇的方法实例总结
Sep 22 PHP
CodeIgniter框架常见用法工作总结
Mar 16 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 PHP
php 输入输出流详解及示例代码
Aug 25 #PHP
PHP 输出缓冲控制(Output Control)详解
Aug 25 #PHP
PHP中利用sleep函数实现定时执行功能实现代码
Aug 25 #PHP
PHP sleep()函数, usleep()函数
Aug 25 #PHP
PHP页面间传递值和保持值的方法
Aug 24 #PHP
PHP中explode函数和split函数的区别小结
Aug 24 #PHP
php处理单文件、多文件上传代码分享
Aug 24 #PHP
You might like
php jquery 多文件上传简单实例
2013/12/23 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
PHP检查URL包含特定字符串实例方法
2019/02/11 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
JS 两个字符串时间的天数差计算
2013/08/25 Javascript
javascript实现捕捉键盘上按下的键
2015/05/05 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
JS常见问题之为什么点击弹出的i总是最后一个
2016/01/05 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
基于Layui自定义模块的使用方法详解
2019/09/14 Javascript
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
python自带tkinter库实现棋盘覆盖图形界面
2019/07/17 Python
基于django ManyToMany 使用的注意事项详解
2019/08/09 Python
python解析xml文件方式(解析、更新、写入)
2020/03/05 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
Python爬虫之Selenium实现关闭浏览器
2020/12/04 Python
Python3使用Selenium获取session和token方法详解
2021/02/16 Python
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
Anthropologie英国:美国家喻户晓的休闲服装和家居产品品牌
2018/12/05 全球购物
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
直接有效的自我评价
2014/01/11 职场文书
会计专业大学生职业生涯规划书
2014/02/11 职场文书
职业培训师职业生涯规划
2014/02/18 职场文书
三查三看党性分析材料
2014/02/18 职场文书
2014信息公开实施方案
2014/02/22 职场文书
献爱心活动总结
2014/05/07 职场文书
2014年法院工作总结
2014/11/24 职场文书
保外就医申请书范文
2015/08/06 职场文书
JavaScript组合继承详解
2021/11/07 Javascript