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语法(4)
Oct 09 PHP
IIS+PHP+MySQL+Zend配置 (视频教程)
Dec 13 PHP
php中cookie的作用域
Mar 27 PHP
php模板中出现空行解决方法
Mar 08 PHP
php curl的深入解析
Jun 02 PHP
解析htaccess伪静态的规则
Jun 18 PHP
PHP生成唯一订单号的方法汇总
Apr 16 PHP
Yii CGridView用法实例详解
Jul 12 PHP
php set_include_path函数设置 include_path 配置选项
Oct 30 PHP
PHP实现多级分类生成树的方法示例
Feb 07 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
Laravel模型间关系设置分表的方法示例
Apr 21 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
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
php实现读取超大文件的方法
2014/07/28 PHP
Yii框架form表单用法实例
2014/12/04 PHP
WordPress分页伪静态加html后缀
2016/06/08 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
php cookie 详解使用实例
2016/11/03 PHP
JavaScript实现网页对象拖放功能的方法
2015/04/15 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
js中遍历Map对象的方法
2016/07/27 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
轻松学习JavaScript函数中的 Rest 参数
2019/05/30 Javascript
js简单遍历获取对象中的属性值的方法示例
2019/06/19 Javascript
Python实现的字典值比较功能示例
2018/01/08 Python
python re模块的高级用法详解
2018/06/06 Python
对python操作kafka写入json数据的简单demo分享
2018/12/27 Python
Python使用post及get方式提交数据的实例
2019/01/24 Python
Python imread、newaxis用法详解
2019/11/04 Python
python实现最短路径的实例方法
2020/07/19 Python
Django框架请求生命周期实现原理
2020/11/13 Python
Superdry极度乾燥官网:日本街头风格,纯英国制造品牌
2016/10/31 全球购物
达拉斯牛仔官方商店:Dallas Cowboys Pro Shop
2018/02/10 全球购物
新加坡领先的在线生活方式和杂货购物网站:EAMART
2019/04/02 全球购物
POP文化和音乐灵感的时尚:Hot Topic
2019/06/19 全球购物
DC Shoes俄罗斯官网:美国滑板鞋和服饰品牌
2020/08/19 全球购物
面向对象编程是如何提高软件开发水平的
2014/05/06 面试题
在C#中如何实现多态
2014/07/02 面试题
Weblogic和WebSphere不同特点
2012/05/09 面试题
关于是否需要写商业计划书
2014/02/07 职场文书
代办委托书怎样写
2014/04/08 职场文书
社区工作者演讲稿
2014/05/23 职场文书
三严三实对照检查材料
2014/08/25 职场文书
2014年绩效考核工作总结
2014/12/11 职场文书
简历中的自我评价应该这样写!
2019/07/12 职场文书
python 逐步回归算法
2021/04/06 Python
各国货币符号大全
2022/02/17 杂记