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简单系统查询模块代码打包下载
Jun 07 PHP
php url地址栏传中文乱码解决方法集合
Jun 25 PHP
php变量作用域的深入解析
Jun 03 PHP
php防止sql注入简单分析
Mar 18 PHP
PHP查找与搜索数组元素方法总结
Jun 12 PHP
怎样搭建PHP开发环境
Jul 28 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
Sep 20 PHP
PHP连接MYSQL数据库实例代码
Jan 20 PHP
PHP中file_exists使用中遇到的问题小结
Apr 05 PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
Oct 11 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 PHP
Nginx+php配置文件及原理解析
Dec 09 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
Godaddy空间Zend Optimizer升级方法
2010/05/10 PHP
ThinkPHP验证码使用简明教程
2014/03/05 PHP
php获取CSS文件中图片地址并下载到本地的方法
2014/12/02 PHP
PHP实现抓取迅雷VIP账号的方法
2015/07/30 PHP
初识PHP中的Swoole
2016/04/05 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
HTML中Select不用Disabled实现ReadOnly的效果
2008/04/07 Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
js同比例缩放图片的小例子
2013/10/30 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
js实现文件上传表单域美化特效
2015/11/02 Javascript
[原创]Javascript 实现广告后加载 可加载百度谷歌联盟广告
2016/05/11 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
JavaScript实现简单验证码
2020/08/24 Javascript
JS实现百度搜索框
2021/02/25 Javascript
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
Django中的“惰性翻译”方法的相关使用
2015/07/27 Python
python爬虫之百度API调用方法
2017/06/11 Python
python的多重继承的理解
2017/08/06 Python
PHP实现发送和接收JSON请求
2018/06/07 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
Pythony运维入门之Socket网络编程详解
2019/04/15 Python
python爬虫之遍历单个域名
2019/11/20 Python
Python调用graphviz绘制结构化图形网络示例
2019/11/22 Python
天美时手表加拿大官网:Timex加拿大
2016/09/01 全球购物
幼儿园消防安全制度
2014/01/26 职场文书
科学发展观标语
2014/10/08 职场文书
出差报告怎么写
2014/11/06 职场文书
《吸血鬼:避世 血猎》官宣4.27发售 系列首款大逃杀
2022/04/03 其他游戏