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 25 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 PHP
PHP 验证码不显示只有一个小红叉的解决方法
Sep 30 PHP
PHP实现变色验证码实例
Jan 06 PHP
php检测apache mod_rewrite模块是否安装的方法
Mar 14 PHP
php实现短信发送代码
Jul 05 PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 PHP
Mac下php 5升级到php 7的步骤详解
Apr 26 PHP
PHP API接口必备之输出json格式数据示例代码
Jun 27 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
php实现每日签到功能
Nov 29 PHP
laravel框架邮箱认证实现方法详解
Nov 22 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 magic_quotes_gpc的使用方法详解
2013/06/24 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
2015/12/17 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
用js调用迅雷下载代码的二种方法
2013/04/15 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
谈谈JavaScript自定义回调函数
2015/10/18 Javascript
Jquery Mobile 自定义按钮图标
2015/11/18 Javascript
AngularJS 让人爱不释手的八种功能
2016/03/23 Javascript
浅谈js函数的多种定义方法与区别
2016/11/29 Javascript
JavaScript变量声明var,let.const及区别浅析
2018/04/23 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
Vue 中 a标签上href无法跳转的解决方式
2019/11/12 Javascript
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python如何重载模块实例解析
2018/01/25 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
python的sys.path模块路径添加方式
2020/03/09 Python
python3的pip路径在哪
2020/06/23 Python
python如何提升爬虫效率
2020/09/27 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
2019/07/18 HTML / CSS
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
毕业生面试求职信
2014/06/23 职场文书
入党积极分子学习党的纲领思想汇报
2014/09/13 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
2014年政教处工作总结
2014/12/20 职场文书
体育活动总结
2015/02/04 职场文书
演讲开场白和结束语
2015/05/29 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis
Sql Server之数据类型详解
2022/02/28 SQL Server