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 相关文章推荐
模拟OICQ的实现思路和核心程序(三)
Oct 09 PHP
php数组函数序列之array_unshift() 在数组开头插入一个或多个元素
Nov 07 PHP
关于PHP内存溢出问题的解决方法
Jun 25 PHP
php var_export与var_dump 输出的不同
Aug 09 PHP
PHP实现设计模式中的抽象工厂模式详解
Oct 11 PHP
CI框架验证码CAPTCHA辅助函数用法实例
Nov 05 PHP
ThinkPHP独立分组使用的注意事项
Nov 25 PHP
php中实现可以返回多个值的函数实例
Mar 21 PHP
php对文件夹进行相关操作(遍历、计算大小)
Nov 04 PHP
Yii视图CGridView列表用法实例分析
Jul 12 PHP
基于PHP实现栈数据结构和括号匹配算法示例
Aug 10 PHP
php连接sftp的作用以及实例代码
Sep 23 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
用Flash图形化数据(二)
2006/10/09 PHP
PHP访问数据库集群的方法小结
2016/03/14 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
PHP创建对象的六种方式实例总结
2019/06/27 PHP
JS Timing
2007/04/21 Javascript
javascript parseInt与Number函数的区别
2010/01/21 Javascript
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
JSON辅助格式化处理方法
2013/03/26 Javascript
JavaScript中的原型和继承详解(图文)
2014/07/18 Javascript
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
2017/02/11 Javascript
JavaScript队列的应用实例详解【经典数据结构】
2017/04/12 Javascript
微信小程序登录态控制深入分析
2017/04/12 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
vue实现多条件和模糊搜索功能
2019/05/28 Javascript
[03:02]2014DOTA2西雅图邀请赛 让队员自己告诉你DK NAVI备战情况
2014/07/08 DOTA
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
python Django批量导入数据
2016/03/25 Python
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
python实现两张图片的像素融合
2019/02/23 Python
pytorch:torch.mm()和torch.matmul()的使用
2019/12/27 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
2019/12/31 Python
将时尚融入珠宝:Adornmonde
2019/10/17 全球购物
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
什么是SQL Server的确定性函数和不确定性函数
2016/08/04 面试题
医学生实习自我鉴定
2013/09/27 职场文书
大学生村官承诺书
2014/03/28 职场文书
电子商务求职信
2014/06/15 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
追讨欠款律师函
2015/05/27 职场文书
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS
为什么MySQL8新特性会修改自增主键属性
2022/04/18 MySQL