php提供实现反射的方法和实例代码


Posted in PHP onSeptember 17, 2019

就算是类成员定义为private也可以在外部访问,不用创建类的实例也可以访问类的成员和方法。

PHP自5.0版本以后添加了反射机制,它提供了一套强大的反射API,允许你在PHP运行环境中,访问和使用类、方法、属性、参数和注释等,其功能十分强大,经常用于高扩展的PHP框架,自动加载插件,自动生成文档,甚至可以用来扩展PHP语言

由于它是PHP?冉ǖ?op扩展,为语言本身自带的特性,所以不需要额外添加扩展或者配置就可以使用。

PHP反射API会基于类,方法,属性,参数等维护相应的反射类,已提供相应的调用API。

访问

假设定义了一个类 User,我们首先需要建立这个类的反射类实例,然后基于这个实例可以访问 User 中的属性或者方法。不管类中定义的成员权限声明是否为public,都可以获取到。

<?php 

namespace Extend;

 

use ReflectionClass;

use Exception;

 

/**

 * 用户相关类

 * Class User

 * @package Extend

 */

class User{

  const ROLE = 'Students';

  public $username = '';

  private $password = '';

 

  public function __construct($username, $password)

  {

    $this->username = $username;

    $this->password = $password;

  }

 

  /**

   * 获取用户名

   * @return string

   */

  public function getUsername()

  {

    return $this->username;

  }

 

  /**

   * 设置用户名

   * @param string $username

   */

  public function setUsername($username)

  {

    $this->username = $username;

  }

 

  /**

   * 获取密码

   * @return string

   */

  private function getPassword()

  {

    return $this->password;

  }

 

  /**

   * 设置密码

   * @param string $password

   */

  private function setPassowrd($password)

  {

    $this->password = $password;

  }

}

 

$class = new ReflectionClass('Extend\User'); // 将类名User作为参数,即可建立User类的反射类

$properties = $class->getProperties(); // 获取User类的所有属性,返回ReflectionProperty的数组

$property = $class->getProperty('password'); // 获取User类的password属性ReflectionProperty

$methods = $class->getMethods();  // 获取User类的所有方法,返回ReflectionMethod数组

$method = $class->getMethod('getUsername'); // 获取User类的getUsername方法的ReflectionMethod

$constants = $class->getConstants();  // 获取所有常量,返回常量定义数组

$constant = $class->getConstant('ROLE');  // 获取ROLE常量

$namespace = $class->getNamespaceName(); // 获取类的命名空间

$comment_class = $class->getDocComment(); // 获取User类的注释文档,即定义在类之前的注释

$comment_method = $class->getMethod('getUsername')->getDocComment(); // 获取User类中getUsername方法的注释文档

注意:创建反射类时传送的类名,必须包含完整的命名空间,即使使用了 use 关键字。否则找不到类名会抛出异常。

以上就是php提供了什么来实现反射的详细内容,感谢大家的学习和对三水点靠木的支持。

PHP 相关文章推荐
PHP 得到根目录的 __FILE__ 常量
Jul 23 PHP
php中转义mysql语句的实现代码
Jun 24 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
ThinkPHP实现二级循环读取的方法
Nov 03 PHP
php中print(),print_r(),echo()的区别详解
Dec 01 PHP
PHP基于单例模式实现的mysql类
Jan 09 PHP
php结合web uploader插件实现分片上传文件
May 10 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
Aug 01 PHP
利用PHP生成静态html页面的原理
Sep 30 PHP
PHP/HTML混写的四种方式总结
Feb 27 PHP
详细解读php的命名空间(二)
Feb 21 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 PHP
php探针使用原理和技巧讲解
Sep 17 #PHP
php探针不显示内存解决方法
Sep 17 #PHP
Laravel 模型关联基础教程详解
Sep 17 #PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
Sep 16 #PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
Sep 16 #PHP
PHP实现的AES 128位加密算法示例
Sep 16 #PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
Sep 16 #PHP
You might like
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
TP5.0框架实现无限极回复功能的方法分析
2019/05/04 PHP
鼠标移动到一张图片时变为另一张图片
2006/12/05 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
每天一篇javascript学习小结(面向对象编程)
2015/11/20 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
bootstrap3 兼容IE8浏览器!
2016/05/02 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
js实现计时器秒表功能
2019/12/16 Javascript
利用JS如何获取form表单数据
2019/12/19 Javascript
VUE 单页面使用 echart 窗口变化时的用法
2020/07/30 Javascript
python模块之StringIO使用示例
2015/04/08 Python
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
python正则实现计算器功能
2017/12/14 Python
python flask中静态文件的管理方法
2018/03/20 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
解决Django no such table: django_session的问题
2020/04/07 Python
python中spy++的使用超详细教程
2021/01/29 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
大二学习计划书范文
2014/04/27 职场文书
促销活动总结范文
2014/04/30 职场文书
书香校园建设方案
2014/05/02 职场文书
初一语文教学反思
2016/03/03 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书
导游词之山西关帝庙
2019/11/01 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python
分享几种python 变量合并方法
2022/03/20 Python
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android