PHP反射学习入门示例


Posted in PHP onJune 14, 2019

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

今天开始学习php 的反射,许多人可能还没有听说过反射这个概念,简单点说反射的就是让你拥有剖析类、函数的能力。

有的同学可能会问我剖析类有什么用,我为什么要学反射,我只能说不学反射并不会对你实现业务有任何影响,但是如果你想写出结构优雅的程序,想写出维护性和扩展性都很高的程序,学习反射是必不可少的。

PHP 内置了一组反射类来实现类的反射,常用的有:

  • ReflectionClass 解析类
  • ReflectionProperty 类的属性的相关信息
  • ReflectionMethod 类方法的有关信息
  • ReflectionParameter 取回了函数或方法参数的相关信息

想看全的就翻手册去。

今天先通过一段演示代码简单看下php的反射到底是个什么东西。

<?php
class Hero {
  protected $name;
  protected $skills = [];
  public function __construct($name, $skills = []) {
    $this->name = $name;
    $this->skills = $skills;
  }
  public function attack($hero) {
    echo "Attack {$hero->name}" . PHP_EOL;
  }
  public function execute($index) {
    echo "Axecute {$index} skill" . PHP_EOL;
  }
}
$ref = new ReflectionClass('Hero');
if ($ref->isInstantiable()) {
  echo '可以实例化' . PHP_EOL;
}
// 获取类的构造函数
$constructor = $ref->getConstructor();
print_r($constructor); //ReflectionMethod E对象
//获取属性
if ($ref->hasProperty('name')) {
  $attr = $ref->getProperty('name');
  print_r($attr); //ReflectionProperty 对象
}
// 获取属性列表
$attributes = $ref->getProperties();
foreach ($attributes as $row) {
  //row 为 ReflectionProperty 的实例
  echo $row->getName() . "\n";
}
// 获取方法
if ($ref->hasMethod('attack')) {
  $method = $ref->getMethod('attack');
  //$method 为 ReflectionMethod 的实例
  print_r($method);
}
// 获取方法列表
$methods = $ref->getMethods();
foreach ($methods as $row) {
  //这的row 是 ReflectionMethod 的实例
  echo $row->getName() . PHP_EOL;
}

运行结果:

可以实例化
ReflectionMethod Object
(
    [name] => __construct
    [class] => Hero
)
ReflectionProperty Object
(
    [name] => name
    [class] => Hero
)
name
skills
ReflectionMethod Object
(
    [name] => attack
    [class] => Hero
)
__construct
attack
execute

学习新东西,首先是要有熟悉感,或者叫手感,有了手感你才会对它不畏惧,先把上面的代码抄上一篇,运行一下,你应该会对php 反射有一点初步的印象。

下一篇再做一个小例子,看看用发可以做什么神奇的事情。

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

PHP 相关文章推荐
web方式ftp
Oct 09 PHP
粗略计算在线时间,bug:ip相同
Dec 09 PHP
php正则校验用户名介绍
Jul 19 PHP
调整PHP的性能
Oct 30 PHP
php中mail函数发送邮件失败的解决方法
Dec 24 PHP
php使用类继承解决代码重复的问题
Feb 11 PHP
PHP实现一维数组转二维数组的方法
Feb 25 PHP
php实现的RSS生成类实例
Apr 23 PHP
PHP 将dataurl转成图片image方法总结
Oct 14 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
May 26 PHP
在laravel5.2中实现点击用户头像更改头像的方法
Oct 14 PHP
YII2 全局异常处理深入讲解
Mar 24 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
Jun 14 #PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
Jun 14 #PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
Jun 14 #PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
Jun 13 #PHP
PHP面向对象程序设计重载(overloading)操作详解
Jun 13 #PHP
PHP面向对象程序设计之构造方法和析构方法详解
Jun 13 #PHP
PHP Cli 模式设置进程名称的方法
Jun 12 #PHP
You might like
一个没有MYSQL数据库支持的简易留言本的编写
2006/10/09 PHP
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
php将数组转换成csv格式文件输出的方法
2015/03/14 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
JS 控制非法字符的输入代码
2009/12/04 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
2012/01/13 Javascript
js自定义事件及事件交互原理概述(一)
2013/02/01 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
2015/07/27 Javascript
JavaScript常用字符串与数组扩展函数小结
2016/04/24 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
如何将百度地图包装成Vue的组件的方法步骤
2019/02/12 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
利用layer实现表单完美验证的方法
2019/09/26 Javascript
JavaScript函数重载操作实例浅析
2020/05/02 Javascript
vue滑动吸顶及锚点定位的示例代码
2020/05/10 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
Window10+Python3.5安装opencv的教程推荐
2018/04/02 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
django中间键重定向实例方法
2019/11/10 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
html5时钟实现代码
2010/10/22 HTML / CSS
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
国贸专业的职业规划范文
2014/01/23 职场文书
师德自我剖析材料范文
2014/10/06 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
阿凡达观后感
2015/06/10 职场文书
幼儿园奖惩制度范本
2015/08/05 职场文书
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL
Redis Stream类型的使用详解
2021/11/11 Redis
详解PyTorch模型保存与加载
2022/04/28 Python