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 相关文章推荐
使用网络地址转换实现多服务器负载均衡
Oct 09 PHP
php 友好URL的实现(吐血推荐)
Oct 04 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
Jun 03 PHP
php读取文件内容的几种方法详解
Jun 26 PHP
php使用多个进程同时控制文件读写示例
Feb 28 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
Aug 15 PHP
php中字符集转换iconv函数使用总结
Oct 11 PHP
Ajax中的JSON格式与php传输过程全面解析
Nov 14 PHP
PHP格式化显示时间date()函数代码
Oct 03 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
May 09 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 PHP
PHP 扩展Memcached命令用法实例总结
Jun 04 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
Oracle 常见问题解答
2006/10/09 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
PHP 使用memcached简单示例分享
2015/03/05 PHP
php生成酷炫的四个字符验证码
2016/04/22 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
2012/10/11 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
详解Document.Cookie
2015/12/25 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
canvas的神奇用法
2017/02/03 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
Vue的Flux框架之Vuex状态管理器
2017/07/30 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
浅谈Vue.js中ref ($refs)用法举例总结
2017/12/19 Javascript
vue+moment实现倒计时效果
2019/08/26 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
Python多进程并发(multiprocessing)用法实例详解
2015/06/02 Python
分享6个隐藏的python功能
2017/12/07 Python
python 巧用正则寻找字符串中的特定字符的位置方法
2018/05/02 Python
python实现桌面气泡提示功能
2019/07/29 Python
基于python中__add__函数的用法
2019/11/25 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
PIP和conda 更换国内安装源的方法步骤
2020/09/21 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
2021/03/04 Python
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
What's the difference between Debug and Trace class? (Debug类与Trace类有什么区别)
2013/09/10 面试题
公司道歉信范文
2014/01/09 职场文书
售后服务承诺书怎么写
2014/05/21 职场文书
2014年电厂工作总结
2014/12/04 职场文书
优秀教师事迹材料
2014/12/15 职场文书
反邪教学习心得体会
2016/01/15 职场文书
java中用float时,数字后面加f,这样是为什么你知道吗
2021/09/04 Java/Android
浅析python中特殊文件和特殊函数
2022/02/24 Python