PHP autoload机制详解

PHP autoload 机制详解 本文主要介绍 PHP autoload 机制,这里整理了详细的知识资料供大家学习参考,希望能帮助有需要的小伙伴 立即下载
(1) autoload机制概述  

  在使用 PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很轻易实现对类进行复用,同时将来维护时也很便利。这也是OO设计的基本思想之一。在PHP5之前,假如需要使用一个类,只需要直接使用include/require将其包含进来即可。下面是一个实际的例子: 
Php代码   收藏代码
  1. class Person {  
  2.   var $name, $age;  
  3.   function __construct ($name, $age)  
  4.   {  
  5.       $this->name = $name;  
  6.       $this->age = $age;  
  7.   }  
  8. }  

Php代码   收藏代码
  1. require_once (”Person.class.php”);  
  2. $person = new Person(”Altair”, 6);  
  3. var_dump ($person);  


  在这个例子中,no-autoload.php文件需要使用Person类,它使用了require_once将其包含,然后就可以直接使用Person类来实例化一个对象。 

  但随着项目规模的不断扩大,使用这种方式会带来一些隐含的题目:假如一个PHP文件需要使用很多其它类,那么就需要很多的require/include语句,这样有可能会造成遗漏或者包含进不必要的类文件。假如大量的文件都需要使用其它的类,那么要保证每个文件都包含正确的类文件肯定是一个噩梦。 

  PHP5为这个题目提供了一个解决方案,这就是类的自动装载(autoload)机制。autoload机制可以使得PHP程序有可能在使用类时才自动包含类文件,而不是一开始就将所有的类文件include进来,这种机制也称为lazy loading。 

  下面是使用autoload机制加载Person类的例子: 
Php代码   收藏代码
  1. function __autoload($classname) {  
  2.   require_once ($classname . “class.php”);  
  3. }  
  4. $person = new Person(”Altair”, 6);  
  5. var_dump ($person);  


  通常PHP5在使用一个类时,假如发现这个类没有加载,就会自动运行__autoload()函数,在这个函数中我们可以加载需要使用的类。在我们这个简单的例子中,我们直接将类名加上扩展名”.class.php”构成了类文件名,然后使用require_once将其加载。从这个例子中,我们可以看出autoload至少要做三件事情,第一件事是根据类名确定类文件名,第二件事是确定类文件所在的磁盘路径(在我们的例子是最简单的情况,类与调用它们的PHP程序文件在同一个文件夹下),第三件事是将类从磁盘文件中加载到系统中。第三步最简单,只需要使用include/require即可。要实现第一步,第二步的功能,必须在开发时约定类名与磁盘文件的映射方法,只有这样我们才能根据类名找到它对应的磁盘文件。 

  因此,当有大量的类文件要包含的时候,我们只要确定相应的规则,然后在__autoload()函数中,将类名与实际的磁盘文件对应起来,就可以实现lazy loading的效果。从这里我们也可以看出__autoload()函数的实现中最重要的是类名与实际的磁盘文件映射规则的实现。 

  但现在题目来了,假如在一个系统的实现中,假如需要使用很多其它的类库,这些类库可能是由不同的开发职员编写的,其类名与实际的磁盘文件的映射规则不尽相同。这时假如要实现类库文件的自动加载,就必须在__autoload()函数中将所有的映射规则全部实现,这样的话__autoload()函数有可能会非常复杂,甚至无法实现。最后可能会导致__autoload()函数十分臃肿,这时即便能够实现,也会给将来的维护和系统效率带来很大的负面影响。在这种情况下,难道就没有更简单清楚的解决办法了吧?答案当然是:NO! 在看进一步的解决方法之前,我们先来看一下PHP中的autoload机制是如何实现的。 

(2) PHP的autoload机制的实现  

  我们知道,PHP文件的执行分为两个独立的过程,第一步是将PHP文件编译成普通称之为OPCODE的字节码序列(实际上是编译成一个叫做zend_op_array的字节数组),第二步是由一个虚拟机来执行这些OPCODE。PHP的所有行为都是由这些OPCODE来实现的。因此,为了研究PHP中autoload的实现机制,我们将autoload.php文件编译成opcode,然后根据这些OPCODE来研究PHP在这过程中都做了些什么: 

Php代码   收藏代码
  1. // require_once (”Person.php”);  
  2. function __autoload ($classname) {  
  3.       0 NOP  
  4.       0 RECV 1  
  5.     if (!class_exists($classname)) {  
  6.       1 SEND_VAR !0  
  7.       2 DO_FCALL ‘class_exists’ [extval:1]  
  8.       3 BOOL_NOT $0 =>RES[~1]  
  9.       4 JMPZ ~1, ->8  
  10.   require_once ($classname. “.class.php”);  
  11.       5 CONCAT !0, ‘.class.php’ =>RES[~2]  
  12.       6 INCLUDE_OR_EVAL ~2, REQUIRE_ONCE  
  13.    }  
  14.       7 JMP ->8  
  15. }  
  16.       8 RETURN null  
  17.   
  18. $p = new Person(’Fred’, 35);  
  19.   1 FETCH_CLASS ‘Person’ =>RES[:0]  
  20.   2 NEW :0 =>RES[$1]  
  21.   3 SEND_VAL ‘Fred’  
  22.   4 SEND_VAL 35  
  23.   5 DO_FCALL_BY_NAME [extval:2]  
  24.   6 ASSIGN !0, $1  
  25.   
  26. var_dump ($p);  
  27.   7 SEND_VAR !0  
  28.   8 DO_FCALL ‘var_dump’ [extval:1]  



  在autoload.php的第10行代码中我们需要为类Person实例化一个对象。因此autoload机制一定会在该行编译后的opcode中有所体现。从上面的第10行代码天生的OPCODE中我们知道,在实例化对象Person时,首先要执行FETCH_CLASS指令。我们就从PHP对FETCH_CLASS指令的处理过程开始我们的探索之旅。 

  通过查阅PHP的源代码(我使用的是PHP 5.3alpha2版本)可以发现如下的调用序列: 

  ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, …) (zend_vm_def.h 1864行) 

  => zend_fetch_class (zend_execute_API.c 1434行) 

  =>zend_lookup_class_ex (zend_execute_API.c 964行) 

  => zend_call_function(&fcall_info, &fcall_cache) (zend_execute_API.c 1040行) 

  在最后一步的调用之前,我们先看一下调用时的关键参数: 

  fcall_info.function_name = &autoload_functi on; // Ooops, 终于发现”__autoload”了 

  … 

  fcall_cache.function_handler = EG(autoload_func); // autoload_func ! 

  zend_call_function是Zend Engine中最重要的函数之一,其主要功能是执行用户在PHP程序中自定义的函数或者PHP本身的库函数。zend_call_function有两个重要的指针形参数fcall_info, fcall_cache,它们分别指向两个重要的结构,一个是zend_fcall_info, 另一个是zend_fcall_info_cache。zend_call_function主要工作流程如下:假如fcall_cache.function_handler指针为NULL,则尝试查找函数名为fcall_info.function_name的函数,假如存在的话,则执行之;假如fcall_cache.function_handler不为NULL,则直接执行fcall_cache.function_handler指向的函数。 

  现在我们清楚了,PHP在实例化一个对象时(实际上在实现接口,使用类常数或类中的静态变量,调用类中的静态方法时都会如此),首先会在系统中查找该类(或接口)是否存在,假如不存在的话就尝试使用autoload机制来加载该类。而autoload机制的主要执行过程为: 

  (1) 检查执行器全局变量函数指针autoload_func是否为NULL。 

  (2) 假如autoload_func==NULL, 则查找系统中是否定义有__autoload()函数,假如没有,则报告错误并退出。

  (3) 假如定义了__autoload()函数,则执行__autoload()尝试加载类,并返回加载结果。 

  (4) 假如autoload_func不为NULL,则直接执行autoload_func指针指向的函数用来加载类。留意此时并不检查__autoload()函数是否定义。 

  ***终于大白,PHP提供了两种方法来实现自动装载机制,一种我们前面已经提到过,是使用用户定义的__autoload()函数,这通常在PHP源程序中来实现;另外一种就是 设计一个函数,将autoload_func指针指向它,这通常使用C语言在PHP扩展中实现。假如既实现了__autoload()函数,又实现了autoload_func(将autoload_func指向某一PHP函数),那么只执行autoload_func函数。 

(3) SPL autoload机制的实现  

  SPL是Standard PHP Library(标准PHP库)的缩写。它是PHP5引进的一个扩展库,其主要功能包括autoload机制的实现及包括各种Iterator接口或类。SPL autoload机制的实现是通过将函数指针autoload_func指向自己实现的具有自动装载功能的函数来实现的。SPL有两个不同的函数spl_autoload, spl_autoload_call,通过将autoload_func指向这两个不同的函数地址来实现不同的自动加载机制。 

  spl_autoload是SPL实现的默认的自动加载函数,它的功能比较简单。它可以接收两个参数,第一个参数是$class_name,表示类名,第二个参数$file_extensions是可选的,表示类文件的扩展名,可以在$file_extensions中指定多个扩展名,护展名之间用分号隔开即可;假如不指定的话,它将使用默认的扩展名.inc或.php。spl_autoload首先将$class_name变为小写,然后在所有的include path中搜索$class_name.inc或$class_name.php文件(假如不指定$file_extensions参数的话),假如找到,就加载该类文件。你可以手动使用spl_autoload(”Person”,“.class.php”)来加载Person类。实际上,它跟require/include差未几,不同的它可以指定多个扩展名。 

  怎样让spl_autoload自动起作用呢,也就是将autoload_func指向spl_autoload?答案是使用spl_autoload_register函数。在PHP脚本中第一次调用spl_autoload_register()时不使用任何参数,就可以将autoload_func指向spl_autoload。 

  通过上面的说明我们知道,spl_autoload的功能比较简单,而且它是在SPL扩展中实现的,我们无法扩充它的功能。假如想实现自己的更灵活的自动加载机制怎么办呢?这时,spl_autoload_call函数闪亮登场了。 

  我们先看一下spl_autoload_call的实现有何奇妙之处。在SPL模块内部,有一个全局变量autoload_functions,它本质上是一个HashTable,不过我们可以将其简单的看作一个链表,链表中的每一个元素都是一个函数指针,指向一个具有自动加载类功能的函数。spl_autoload_call本身的实现很简单,只是简单的按顺序执行这个链表中每个函数,在每个函数执行完成后都判定一次需要的类是否已经加载,假如加载成功就直接返回,不再继续执行链表中的其它函数。假如这个链表中所有的函数都执行完成后类还没有加载,spl_autoload_call就直接退出,并不向用户报告错误。因此,使用了autoload机制,并不能保证类就一定能正确的自动加载,关键还是要看你的自动加载函数如何实现。 

  那么自动加载函数链表autoload_functions是谁来维护呢?就是前面提到的spl_autoload_register函数。它可以将用户定义的自动加载函数注册到这个链表中,并将autoload_func函数指针指向spl_autoload_call函数(留意有一种情况例外,具体是哪种情况留给大家思考)。我们也可以通过spl_autoload_unregister函数将已经注册的函数从autoload_functions链表中删除。 

  上节说过,当autoload_func指针非空时,就不会自动执行__autoload()函数了,现在autoload_func已经指向了spl_autoload_call,假如我们还想让__autoload()函数起作用应该怎么办呢?当然还是使用spl_autoload_register(__autoload)调用将它注册到autoload_functions链表中。 

  现在回到第一节最后的题目,我们有了解决方案:根据每个类库不同的命名机制实现各自的自动加载函数,然后使用spl_autoload_register分别将其注册到SPL自动加载函数队列中就可了。这样我们就不用维护一个非常复杂的__autoload函数了。 

(4) autoload效率题目及对策  

  使用autoload机制时,很多人的第一反应就是使用autoload会降低系统效率,甚至有人干脆提议为了效率不要使用autoload。在我们了解了autoload实现的原理后,我们知道autoload机制本身并不是影响系统效率的原因,甚至它还有可能进步系统效率,由于它不会将不需要的类加载到系统中。 

  那么为什么很多人都有一个使用autoload会降低系统效率的印象呢?实际上,影响autoload机制效率本身恰正是用户设计的自动加载函数。假如它不能高效的将类名与实际的磁盘文件(留意,这里指实际的磁盘文件,而不仅仅是文件名)对应起来,系统将不得不做大量的文件是否存在(需要在每个include path中包含的路径中往寻找)的判定,而判定文件是否存在需要做磁盘I/O操纵,众所周知磁盘I/O操纵的效率很低,因此这才是使得autoload机制效率降低的罪魁罪魁! 

  因此,我们在系统设计时,需要定义一套清楚的将类名与实际磁盘文件映射的机制。这个规则越简单越明确,autoload机制的效率就越高。 

  结论:autoload机制并不是自然的效率低下,只有滥用autoload,设计不好的自动装载函数才会导致其效率的降低。
决策树简介/PPT 最近给我们组新生讲了决策树的相关知识,以下是所做的PPT,参考了网络资源。 阅读详情

相关推荐

Delphi开发者必备:CEF4Delphi跨平台浏览器嵌入实战指南(含Lazarus适配)

本文详细介绍了Delphi开发者如何利用CEF4Delphi实现跨平台浏览器嵌入,包括环境配置、Lazarus适配、ARM架构优化及Firemonkey集成等实战技巧。通过Chromium引擎的强大功能,开发者可以轻松为传统桌面应用添加现代浏览器特性,提升多平台开发效率。

weixin_29233333的博客 226

什么是PHP的自动加载(autoload)?如何实现?

PHP的自动加载(Autoload)是一种动态加载未定义类的机制,允许开发者在不显式使用include或require语句的情况下,按需加载类文件。其核心作用是简化代码依赖管理,提升开发效率和系统灵活性。PHP自动加载机制通过动态解析类名与文件路径,显著提升了代码的可维护性和扩展性。从传统的到现代的,开发者需根据项目需求选择合适方案。结合Composer和PSR标准,能够高效管理大型项目的依赖关系,是现代PHP开发的基石之一。

破损的天堂鸟博客 1658

深入解析Lora SX1268:从基础配置到高级应用

本文深入解析了LoRa SX1268芯片从基础配置到高级应用的全过程。详细介绍了LoRa与FSK模式选择、核心参数(BW、SF、CR、LDRO)的配置策略、数据帧结构、缓冲区管理以及CAD模式等关键概念,旨在帮助开发者充分发挥SX1268在远距离、低功耗物联网通信中的潜力,并提供实用的调试技巧。

weixin_29168393的博客 117

PHP-自动加载原理分析

说起PHP的自动加载,很多同学可能都会想到各种框架的自动加载功能,PHP规范中的PSR0和PSR4原则,Composer的自动加载功能等等,这些都为我们的开发提供了很大的方便。 那么PHP自动加载的前因后果到底是什么?PHP的内部原理又是怎么样的呢?接下来我就根据自己的理解进行一下分析总结: 为什么会有自动加载? 在PHP面向对象(OO)编程中,为了方便管理,我们都会把一个类写在一个单独的文件中

晨风的博客 5699

Java 大视界 -- Java+Spark MLlib 构建智能推荐系统:协同过滤算法实战与优化(441)

Java+Spark MLlib构建智能推荐系统实战 本文详细介绍了基于Java和Spark MLlib构建协同过滤推荐系统的全流程实践方案。主要内容包括: 架构设计:采用离线批处理为主、近实时更新为辅的架构,包含数据采集层、处理层、模型层、推荐生成层、存储层和应用层六大模块,可支撑千万级用户推荐需求。 技术实现: 使用Spark MLlib的ALS算法进行协同过滤模型训练 提供数据清洗、模型训练、推荐生成等核心代码实现 采用MySQL存储推荐结果,支持批量插入和事务保障 生产级优化: 版本化模型存储规避覆

【青云交】华为云云享专家 | 阿里云开发者社区专家博主 技术圈个人影响力前 9 | 博客之星 TOP12 优快云 首位四榜(原力榜 / 作者周榜 / 领军人物 / 综合热榜)榜首,破平台纪录! 苏州地区全榜霸榜,感恩全网十多万粉丝同行! 2531

YOLOv5 改进点总览:轻量化、高精度的背后有哪些魔改?

YOLOv5是由Ultralytics团队开发的高效目标检测模型,其核心改进包括:主干网络采用CSPDarknet53提升梯度传播效率;特征融合使用PANet增强小目标识别;输出结构采用解耦头设计优化定位和分类任务。此外,YOLOv5通过CIoU损失函数、Mosaic数据增强和SimOTA标签分配机制进一步提升性能。模型支持多种推理格式(ONNX/TensorRT等),并具备自动锚框匹配和多尺度训练功能,使其在轻量化(yolov5s仅7MB)与高性能(最高51.2% mAP)间取得平衡,但缺乏正式论文支撑是

guoguozgw的博客 1805

PHP 自动加载功能原理解析

这篇文章是对 PHP 自动加载功能的一个总结,内容涉及 PHP 的自动加载功能、 PHP 的命名空间、 PHP 的 PSR0 与 PSR4 标准等内容。 一、PHP 自动加载功能 PHP 自动加载功能的由来 在 PHP 开发过程中,如果希望从外部引入一个 class,通常会使用 include 和 require 方法,去把定义这个 class 的文件包含进来。这个在小规模开发的时候,没什么大问题。但在大型的开发项目中,使用这种方式会带来一些隐含的问题:如果一个 PHP 文件需要使用很多其它类,那么就需要很

cangqiong_xiamen的博客 708

深入解析:如何基于开源OpENer开发EtherNet/IP从站服务

通过OpENer开源库,开发者可以快速实现符合ODVA规范的EtherNet/IP从站设备,降低开发成本并提高系统灵活性。本文详细介绍了EtherNet/IP协议原理、OpENer库的特点与优缺点,以及二次开发的完整流程。通过遵循本文提供的指南,开发者可以成功构建出工业级的EtherNet/IP通信设备。

极地星辰 2999

php中autoload机制详解

参考:https://www.phpmianshi.com/?id=237 背景 PHP在魔术函数__autoload()方法出现以前,如果你要在一个程序文件中实例化100个对象,那么你必须用include或者require包含进来100个类文件,或者你把这100个类定义在同一个类文件中——相信这个文件一定会非常大。但是__autoload()方法出来了,以后就不必为此大伤脑筋了,这个类会在你实例化对象之前自动加载指定的文件。 autoload 机制概述 在使用PHP的OO模式开发系统时,通常.

tiancityycf的专栏 421

Windows 11 + AMD 780M 运行 ComfyUI 完整指南:DirectML 实战方案

ComfyUI 是基于 PyTorch 的 Stable Diffusion 可视化工作流工具,其性能高度依赖 GPU 后端支持。在 Windows 平台,传统 CUDA 方案仅适配 NVIDIA 显卡,而 AMD 核显用户长期面临 ROCm 兼容性差、驱动链路断裂等系统级障碍。DirectML 作为微软原生机器学习 API,绕过 ROCm 生态断层,直接对接 DirectX 12 硬件抽象层,成为 RDNA 3 架构(如 Radeon 780M)在 Windows 11 上运行 AI 绘画的最优解。它提供

weixin_30099989的博客 726

Zemax实战录——非序列模式下的微透镜阵列仿真与优化

本文详细介绍了在Zemax非序列模式下进行微透镜阵列仿真的完整流程与优化技巧。文章重点阐述了从序列模式切换到非序列模式的必要性,并逐步指导如何搭建光源、阵列与探测器的仿真环境。核心在于通过调整圆锥系数等关键参数优化像差,并增加光线数以提升仿真精度与均匀性,为光学设计提供可靠依据。

weixin_28339967的博客 521

autoload php 机制,autoload在PHP中的运行机制是什么

autoload在PHP中的运行机制是什么发布时间:2020-12-14 16:29:50来源:亿速云阅读:76作者:Leah这篇文章给大家介绍autoload在PHP中的运行机制是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。php实现autoload有两种方法:1、拦截器__autoload()2、设置全局变量函数指针autoload_func为指定函数。通常在c扩展...

weixin_35404745的博客 345

别再瞎改网络结构了!解决YOLO小目标检测痛点,我用这招把mAP提了15%

本文基于我7年工业PCB缺陷检测、无人机航拍、安防监控项目的一线落地经验,针对YOLO小目标检测最痛的「漏检率高、特征丢失、精度难提升」三大核心问题,拆解出。本文全程配套小目标特征丢失原理图、分块训练流程图、切图前后效果对比图、mAP提升柱状图、多方案性能对比表等可视化内容,从YOLO天生不擅长小目标的底层根源、方案核心原理、可直接复制的代码实现,到工业场景实测验证、新手必踩的10个坑位避坑指南,全链路讲透。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 387

PHP5自动加载(autoload)机制

1、autoload机制概述使用PHP OOP模式开发系统时,出于文件组织结构的原因,将各个类放在单独的文件,每个类专注于一个任务,是OOP开发的基本思想之一:高内聚。这样易于对类进行复用和维护。一般地,如果需要使用到这个类时,就可以通过require_once()语句来实现。如://Books.class.phpclass Books{  

沉浮 2528

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

[转]PHP autoload机制详解

2008.12.13注:关于SPL的autoload的函数手册,请参考 SPL函数手册:http://www.phpinternals.com/blog/2008/12/translate-refs-spl-functions/(1) autoload机制概述  在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类

heiyeluren的blog(黑夜路人的开源世界) 2554

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

php autoload 原理,PHP的autoload机制的实现解析

一、autoload机制概述在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利。这也是OO设计的基本思想之一。在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可。下面是一个实际的例子:/* Person.class.php */class Person {var ...

weixin_34433661的博客 498

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

php 中autoload机制

这是一篇解释很详细的文章,来自php100,贴在这里给自己鼓励! (1) autoload机制概述    在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利。这也是OO设计的基本思想之一。在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可。下面是一个实际

baixiaoshi的专栏 721

PHP autoload(自动加载)代码机制详解

PHP autoload机制详解 (1) autoload机制概述 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利。这 也是OO设计的基本思想之一。在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可。下面是一个实际的例 子: /* Perso

ding_zhi_jie的专栏 620

php autoload工作原理,深入PHP autoload机制的详解

在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便 利。这 也是OO设计的基本思想之一。在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可。下面是一个实际的例 子:/* Person.class.php */class Person {var $name, $age...

weixin_39734020的博客 559
上一篇: php5中const、define和static
下一篇: 8086汇编
chapter_lin
博客等级 码龄14年 1粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值