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 相关文章推荐
Windows7下PHP开发环境安装配置图文方法
May 20 PHP
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
Nov 02 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
May 23 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
Dec 18 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
May 21 PHP
Linux操作系统安装LAMP环境
Jun 26 PHP
php注册登录系统简化版
Dec 28 PHP
简单谈谈 php 文件锁
Feb 19 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
Jun 06 PHP
基于php双引号中访问数组元素报错的解决方法
Feb 01 PHP
PHPUnit测试私有属性和方法功能示例
Jun 12 PHP
php-7.3.6 编译安装过程
Feb 11 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
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
php ftp文件上传函数(基础版)
2010/06/03 PHP
PHP获取文件后缀名的三个函数
2012/10/15 PHP
PHP登录验证码的实现与使用方法
2016/07/07 PHP
js form action动态修改方法
2008/11/04 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
2016/08/11 Javascript
JavaScript常用正则函数用法示例
2017/01/23 Javascript
ES6新特性之字符串的扩展实例分析
2017/04/01 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
微信小程序实现页面跳转传值以及获取值的方法分析
2017/12/18 Javascript
express 项目分层实践详解
2018/12/10 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
在Django的通用视图中处理Context的方法
2015/07/21 Python
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
详解如何设置Python环境变量?
2019/05/13 Python
Python大数据之使用lxml库解析html网页文件示例
2019/11/16 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
佳能德国网上商店:Canon德国
2017/03/18 全球购物
欧舒丹比利时官网:L’OCCITANE比利时
2017/04/25 全球购物
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
阿迪达斯越南官网:adidas越南
2020/07/19 全球购物
Servlet面试题库
2015/07/18 面试题
劲霸男装广告词
2014/03/21 职场文书
学雷锋活动倡议书
2014/08/30 职场文书
自查自纠工作总结
2014/10/15 职场文书
党建工作汇报材料
2014/12/24 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
拖欠货款起诉状
2015/05/20 职场文书
javascript canvas实现雨滴效果
2021/06/09 Javascript
Python3接口性能测试实例代码
2021/06/20 Python
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android
Python OpenGL基本配置方式
2022/05/20 Python