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 相关文章推荐
关于时间计算的结总
Dec 06 PHP
php 小乘法表实现代码
Jul 16 PHP
PHP编程函数安全篇
Jan 08 PHP
解析MySql与Java的时间类型
Jun 22 PHP
PHP APC缓存配置、使用详解
Mar 06 PHP
php+mysqli数据库连接的两种方式
Jan 28 PHP
php通过curl模拟登陆DZ论坛
May 11 PHP
PHP微信开发之二维码生成类
Jun 26 PHP
PHP使用缓存即时输出内容(output buffering)的方法
Aug 03 PHP
Yii数据模型中rules类验证器用法分析
Jul 15 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
基于PHP实现邮箱验证激活过程详解
Oct 28 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+oracle 分页类
2006/10/09 PHP
使用PHP实现下载CSS文件中的图片
2015/12/06 PHP
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
Javascript面向对象之四 继承
2011/02/08 Javascript
表单验证的完整应用案例探讨
2013/03/29 Javascript
javascript常用正则表达式汇总
2015/07/31 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
ES6记录异步函数的执行时间详解
2016/08/31 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
微信小程序 页面跳转传递值几种方法详解
2017/01/12 Javascript
微信小程序 跳转方式总结
2017/04/20 Javascript
jQuery实现 RadioButton做必选校验功能
2017/06/15 jQuery
node vue项目开发之前后端分离实战记录
2017/12/13 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
python使用mysql的两种使用方式
2018/03/07 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
Python实现高斯函数的三维显示方法
2018/12/29 Python
python分数表示方式和写法
2019/06/26 Python
python中reload重载实例用法
2020/12/15 Python
Python类型转换的魔术方法详解
2020/12/23 Python
基于Jquery和Css3代码制作可以缩放的搜索框
2015/11/19 HTML / CSS
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
实习评语
2013/12/16 职场文书
公司离职证明范本
2014/01/13 职场文书
抗洪救灾先进集体事迹材料
2014/05/26 职场文书
餐厅周年庆活动方案
2014/08/25 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
初中生活随笔
2015/08/15 职场文书
巾帼建功标兵先进事迹材料
2016/02/29 职场文书
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
2021/10/05 Javascript