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项目的方法
Oct 09 PHP
PHP中的超全局变量
Oct 09 PHP
PHP与MySQL开发中页面出现乱码的一种解决方法
Jul 29 PHP
php中对xml读取的相关函数的介绍一
Jun 05 PHP
php生成缩略图的类代码
Oct 02 PHP
PHP数组交集的优化代码分析
Mar 06 PHP
深入apache host的配置详解
Jun 09 PHP
PHP版微信公众平台红包API
Apr 02 PHP
启用Csrf后POST数据时出现的400错误
Jul 05 PHP
CodeIgniter自定义控制器MY_Controller用法分析
Jan 20 PHP
PHP中的表达式简述
May 29 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 16 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
解析如何修改phpmyadmin中的默认登陆超时时间
2013/06/25 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
PHP json_encode() 函数详解及中文乱码问题
2015/11/05 PHP
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
jQuery-serialize()输出序列化form表单值的方法
2012/12/26 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
javascript 继承学习心得总结
2016/03/17 Javascript
jquery插件Jplayer使用方法简析
2016/04/22 Javascript
javascript阻止事件冒泡和浏览器的默认行为
2017/01/21 Javascript
vue 项目常用加载器及配置详解
2018/01/22 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
小程序云开发实现数据库异步操作同步化
2019/05/18 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
python中的逆序遍历实例
2019/12/25 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
千禧酒店及度假村官方网站:Millennium Hotels and Resorts
2019/05/10 全球购物
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
一套带答案的C++笔试题
2014/01/10 面试题
25道Java面试题集合
2013/05/21 面试题
高中生期末评语大全
2014/01/28 职场文书
初中同学聚会邀请函
2014/02/03 职场文书
十八届三中全会学习方案
2014/02/16 职场文书
普通大学毕业生自荐信范文
2014/02/23 职场文书
幼儿园大班毕业教师寄语
2014/04/03 职场文书
《记金华的双龙洞》教学反思
2014/04/19 职场文书
产品生产计划书
2014/05/07 职场文书
关于保护环境的标语
2014/06/09 职场文书
电工实训报告总结
2014/11/05 职场文书
出差报告怎么写
2014/11/06 职场文书
刑事法律意见书
2015/06/04 职场文书
经典励志格言:每日一句,让你每天充满能量
2019/08/16 职场文书
教你使用TensorFlow2识别验证码
2021/06/11 Python
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android