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 相关文章推荐
php仿ZOL分页类代码
Oct 02 PHP
php adodb操作mysql数据库
Mar 19 PHP
php excel reader读取excel内容存入数据库实现代码
Dec 06 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
php 邮件发送问题解决
Mar 22 PHP
PHP实现简单汉字验证码
Jul 28 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
Nov 24 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
Aug 21 PHP
php版微信公众号自定义分享内容实现方法
Sep 22 PHP
ThinkPHP实现附件上传功能
Apr 27 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
PHP Trait代码复用类与多继承实现方法详解
Jun 17 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
set_include_path在win和linux下的区别
2008/01/10 PHP
遍历指定目录下的所有目录和文件的php代码
2011/11/27 PHP
关于Sphinx创建全文检索的索引介绍
2013/06/25 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
DOM相关内容速查手册
2007/02/07 Javascript
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
javascript对select标签的控制(option选项/select)
2013/01/31 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
JavaScript中apply方法的应用技巧小结
2016/09/29 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
jQuery实现简单日期格式化功能示例
2017/09/19 jQuery
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
迅速了解一下ES10中Object.fromEntries的用法使用
2019/03/05 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
小程序接入腾讯位置服务的详细流程
2020/03/03 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
在Python中使用Neo4j数据库的教程
2015/04/16 Python
python PyTorch预训练示例
2018/02/11 Python
用Python解决x的n次方问题
2019/02/08 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
2019/07/11 Python
Python编程中类与类的关系详解
2019/08/08 Python
python 基于opencv实现高斯平滑
2020/12/18 Python
澳洲小众品牌的集合网站:BNKR
2018/02/23 全球购物
英国在线花园中心:You Garden
2018/06/03 全球购物
SQL Server的固定数据库角色都有哪些?对应的服务器权限有哪些?
2013/05/18 面试题
奶茶专卖店创业计划书
2014/01/18 职场文书
电大毕业自我鉴定
2014/02/03 职场文书
三查三看党性分析材料
2014/02/18 职场文书
聚美优品陈欧广告词
2014/03/14 职场文书
房产代理公证处委托书
2014/04/04 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
2014幼儿园教师个人工作总结
2014/11/08 职场文书