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
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
Apr 13 PHP
基于wordpress主题制作的具体实现步骤
May 10 PHP
PHP代码保护--Zend Guard的使用详解
Jun 03 PHP
PHP迭代器实现斐波纳契数列的函数
Nov 12 PHP
thinkphp模板输出技巧汇总
Nov 24 PHP
PHP实现抓取Google IP并自动修改hosts文件
Feb 12 PHP
php注册和登录界面的实现案例(推荐)
Oct 24 PHP
php及codeigniter使用session-cookie的方法(详解)
Apr 06 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
May 14 PHP
mysqli扩展无法在PHP7下升级问题的解决
Sep 10 PHP
Laravel 简单实现Ajax滚动加载示例
Oct 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+mysql写的简单留言本实例代码
2008/07/25 PHP
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
JS的replace方法介绍
2012/10/20 Javascript
js如何获取file控件的完整路径具体实现代码
2013/05/15 Javascript
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
2016/11/21 NodeJs
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
javascript使用递归算法求两个数字组合功能示例
2017/01/03 Javascript
微信小程序 登录实例详解
2017/01/16 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
利用three.js画一个3D立体的正方体示例代码
2017/11/19 Javascript
vue2过滤器模糊查询方法
2018/09/16 Javascript
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
python使用webbrowser浏览指定url的方法
2015/04/04 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
2016/06/14 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
python读取yaml文件后修改写入本地实例
2020/04/27 Python
CSS3 Columns分列式布局方法简介
2014/05/03 HTML / CSS
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
2018/02/01 HTML / CSS
data:image data url 文件转为Blob上传后端的方法
2019/07/16 HTML / CSS
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
澳大利亚最受欢迎的美发和美容在线商店:Catwalk
2018/12/12 全球购物
高考备战决心书
2014/03/11 职场文书
总经理秘书岗位职责
2014/03/17 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
人才市场接收函
2015/01/30 职场文书
《地震中的父与子》教学反思
2016/02/16 职场文书
导游词之包公祠
2019/11/25 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
MySQL 全文检索的使用示例
2021/06/07 MySQL
Python编解码问题及文本文件处理方法详解
2021/06/20 Python