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 进程锁定问题分析研究
Nov 24 PHP
PHP编码规范的深入探讨
Jun 06 PHP
windows7下安装php的php-ssh2扩展教程
Jul 04 PHP
ThinkPHP关于session的操作方法汇总
Jul 18 PHP
php json_encode()函数返回json数据实例代码
Oct 10 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
Mar 27 PHP
PHP开发实现微信退款功能示例
Nov 25 PHP
php微信分享到朋友圈、QQ、朋友、微博
Feb 18 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
Jul 08 PHP
PHP设计模式之命令模式示例详解
Dec 20 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
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
laravel实现上传图片,并且制作缩略图,按照日期存放的代码
2019/10/16 PHP
PHP Swoole异步读取、写入文件操作示例
2019/10/24 PHP
JavaScript的单例模式 (singleton in Javascript)
2010/06/11 Javascript
jQuery Ajax请求状态管理器打包
2012/05/03 Javascript
有关于eclipse配置spket需要注意的一些地方
2013/04/07 Javascript
Jquery 在页面加载后执行的几种方式
2014/03/14 Javascript
js获取checkbox值的方法
2015/01/28 Javascript
jquery radio的取值_radio的选中_radio的重置方法
2016/09/20 Javascript
Cookies 和 Session的详解及区别
2017/04/21 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
详解Eslint 配置及规则说明
2018/09/10 Javascript
angular2 NgModel模块的具体使用方法
2019/04/10 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
JavaScript中常用的3种弹出提示框(alert、confirm、prompt)
2020/11/10 Javascript
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
Python多线程学习资料
2012/12/19 Python
利用Python和OpenCV库将URL转换为OpenCV格式的方法
2015/03/27 Python
使用python+whoosh实现全文检索
2019/12/09 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
html5拖曳操作 HTML5实现网页元素的拖放操作
2013/01/02 HTML / CSS
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
生物制药毕业生自荐信
2013/10/16 职场文书
继承公证书
2014/04/09 职场文书
中华魂演讲稿
2014/05/13 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
个人原因辞职信模板
2015/05/13 职场文书
2019年七夕情人节浪漫祝福语大全!
2019/08/08 职场文书
详解MySQL的Seconds_Behind_Master
2021/05/18 MySQL
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers