当前位置: 首页 > news >正文

【PECL】在扩展中实现 autoload

【PECL】在扩展中实现 autoload

  • 摘要
  • PHP代码想这么写
  • C 代码这么实现

摘要

php-8.3.x 用扩展写个框架。想实现类管理器,自动加载,上代码:

PHP代码想这么写

$ws = new \Ziima\Applet();
$ws->import('Ziima', '../base/core');
$ws->runAutoload();$t = new \Ziima\Template\Context();
print_r($t);

C 代码这么实现

没有文档,硬翻源代码一点点抠出来这么个思路,能用。

ZEND_METHOD(Ziima_Applet, runAutoload) {zval *this       = getThis();zend_string *req = NULL;ZEND_PARSE_PARAMETERS_START(0, 1)Z_PARAM_OPTIONALZ_PARAM_STR(req)ZEND_PARSE_PARAMETERS_END();//[1] 没有参数 , 或者 this._auto 未设置,判断是PHP调用 runAutoload 来注册zval *_auto = zend_read_property(ce_Ziima_Applet, Z_OBJ_P(this), ZEND_STRL("_auto"), true, NULL);if (_auto == NULL || Z_TYPE_P(_auto) != IS_OBJECT) {zval           cu, par_r;zend_function *fn = zend_hash_str_find_ptr_lc(&Z_OBJCE_P(this)->function_table, ZEND_STRL("runAutoload"));zend_create_closure(&cu, fn, ce_Ziima_Applet, ce_Ziima_Applet, this);zend_fcall_info fci;fci.size         = sizeof(zend_fcall_info);fci.object       = NULL;fci.named_params = NULL;fci.retval       = &par_r;fci.param_count  = 3;fci.params       = ecalloc(sizeof(zval), 3);ZVAL_COPY_VALUE(fci.params, &cu);ZVAL_TRUE(fci.params + 1);ZVAL_TRUE(fci.params + 2);ZVAL_STRING(&fci.function_name, "spl_autoload_register");if (zend_call_function(&fci, NULL) != SUCCESS) {zval_delref_p(&cu);RETURN_FALSE;}if (Z_TYPE(par_r) != IS_TRUE) {zval_delref_p(&cu);RETURN_FALSE;}zend_update_property(ce_Ziima_Applet, Z_OBJ_P(this), ZEND_STRL("_auto"), &cu);RETURN_TRUE;}// [2] 有参数进来,则认为是被 spl_autoload_register 调用的if (req == NULL) {RETURN_FALSE;}zval *_vendor = zend_read_property(ce_Ziima_Applet, Z_OBJ_P(this), ZEND_STRL("_vendor"), true, NULL);if (_vendor == NULL || Z_TYPE_P(_vendor) != IS_ARRAY)RETURN_FALSE;if (zend_array_count(Z_ARR_P(_vendor)) < 1)RETURN_FALSE;// [3] 类加载器只能处理有命名空间的if (!nstr_contains(req->val, req->len, '\\'))RETURN_FALSE;vector_object *vreq   = vector_split_ex(req->val, req->len, '\\', VCONF_AUTO_TRIM | VCONF_DENY_EMPTY);vector_item   *ve     = vector_first(vreq);zend_string   *ns_req = zend_string_init(ve->key.val, ve->key.len, false);zend_string   *dp_req = NULL;zend_long      h      = 0;zend_string   *k      = NULL;zval          *v      = NULL;// [4] 找登记路径ZEND_HASH_MAP_FOREACH_KEY_VAL(Z_ARR_P(_vendor), h, k, v)if (k->len != ns_req->len)continue;if (strncasecmp(k->val, ns_req->val, ns_req->len) == 0) {dp_req = zend_string_dup(Z_STR_P(v), false);break;}ZEND_HASH_FOREACH_END();if (dp_req == NULL) {vector_destroy(vreq);zend_string_release(ns_req);RETURN_FALSE;}// [5] 拼路径buf_string tmp;bstr_init(&tmp, dp_req->len + req->len + 64);bstr_append(&tmp, dp_req->val);if (tmp.val[dp_req->len - 1] == '/') {tmp.val[dp_req->len - 1] = 0;tmp.len--;}VECTOR_FOREACH_BEGIN(vreq, h, ve)if (h == 1)continue;bstr_append_char(&tmp, '/');bstr_append_ex(&tmp, ve->key.val, ve->key.len);VECTOR_FOREACH_END();vector_destroy(vreq);bstr_append(&tmp, ".php");// [6] 查文件zend_string_release(ns_req);zend_string_release(dp_req);if (access(tmp.val, F_OK) != 0) {bstr_free(&tmp);RETURN_FALSE;}// kdebug("load %s from %s", ns_req->val, tmp.val);// [7] 用 eval + include_once 包含bstr_append(&tmp, "');");const char *ps = "include_once('";uint32_t    ls = strlen(ps);memmove(tmp.val + ls, tmp.val, tmp.len);memcpy(tmp.val, ps, ls);if (zend_eval_string(tmp.val, NULL, "ziima_autoload_script") != SUCCESS) {bstr_free(&tmp);RETURN_FALSE;}bstr_free(&tmp);RETURN_TRUE;
}

相关文章:

【PECL】在扩展中实现 autoload

【PECL】在扩展中实现 autoload 摘要PHP代码想这么写C 代码这么实现 摘要 php-8.3.x 用扩展写个框架。想实现类管理器&#xff0c;自动加载&#xff0c;上代码&#xff1a; PHP代码想这么写 $ws new \Ziima\Applet(); $ws->import(Ziima, ../base/core); $ws->runAu…...

企业微信H5授权登录

在企业中如果需要在打开的网页里面携带用户的身份信息&#xff0c;第一步需要获取code参数 如何实现企业微信H5获取当前用户信息即accessToken&#xff1f; 1.在应用管理--》创建应用 2.创建好应用&#xff0c;点击应用主页-》设置-》网页-》将授权链接填上去 官方文档可以看…...

玩机进阶教程------修改gpt.bin分区表地址段 完全屏蔽系统更新 fast刷写分区表 操作步骤解析【二】

上期博文简单说明了分区表的基本常识。我们在有些环境中需要屏蔽手机的系统更新选项。除了以前博文中说明的修改系统更新下载文件夹的方法。还可以通过修改分区表类达到目的。在一些辅助维修工具上面带修改分区表功能。修改后效果为屏蔽系统更新和可以恢复出厂。原则上不深刷都…...

Java实现数据结构---数组

文章目录 概念存储原理数组的操作完整代码 概念 数组是&#xff08;Array&#xff09;是有限个相同类型的变量所组成的有序集合&#xff0c;数组中的每一个变量为称为元素。数组是最简单、最常用的数据结构。 数组下标从零开始。 存储原理 数组用一组连续的内存空间来存储一…...

java解析excel文件,返回json

我这里用的是springboot项目&#xff0c;配合Maven使用的。首先需要引入依赖&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency…...

uniapp 添加字体ttf

效果图如下 一、逻辑概述 在uniapp中使用字体&#xff0c;一共分成两种情况&#xff0c;一种是普通vue页面&#xff0c;一种是nvue页面引入字体。。 1.vue页面引入字体需要如下步骤 1. 先选择下载一种字体&#xff1a;字体格式一般为 ttf后缀名 黄凯桦律师手写体免费下载和在线…...

Linux入门攻坚——24、BIND编译安装、Telnet和OpenSSH

BIND编译安装 对于没有rpm包&#xff0c;需要源代码编译安装。 1、下载源代码&#xff1a;bind-9.12.2-P1.tar.gz&#xff0c;解压&#xff1a;tar -xf bind-9.12.2-P1.tar.gz 2、完善环境&#xff1a; 1&#xff09;增加用户组named&#xff1a;groupadd -g 53 named 2&…...

1.5.3 基于Java配置方式使用Spring MVC

本实战教程主要介绍了如何使用Java配置方式来使用Spring MVC框架。相较于XML配置方式&#xff0c;Java配置方式提供了一种更为简洁和灵活的配置方法。 项目创建与配置 创建一个Jakarta EE项目&#xff0c;并设置项目名称和位置。选择Jakarta EE 10版本&#xff0c;不添加依赖&a…...

Artifactory清理二进制文件丢失的制品

一、摘要 当制品上传到 Artifactory 时&#xff0c;Artifactory 会在数据库中记录制品的相关元数据信息&#xff0c;包括文件路径、大小、校验和&#xff08;如 MD5、SHA1&#xff09;、上传时间、索引、依赖等。实际的制品二进制文件会存储在指定的存储后端&#xff0c;具体的…...

C#中的数组探索

在C#编程语言中&#xff0c;数组是一种基本的数据结构&#xff0c;用于存储固定大小的同类型元素序列。本文将深入探讨C#数组的各个方面&#xff0c;包括定义、赋值、范围操作、切片、多维数组&#xff08;矩形与锯齿形&#xff09;、简化初始化表达式以及边界检查。 数组定义…...

身份认证与口令攻击

身份认证与口令攻击 身份认证身份认证的五种方式口令认证静态口令动态口令(一次性口令)动态口令分类 密码学认证一次性口令认证S/KEY协议改进的S/KEY协议 其于共享密钥的认证 口令行为规律和口令猜测口令规律口令猜测 口令破解操作系统口令破解Windows密码存储机制Windows密码破…...

卷积网络迁移学习:实现思想与TensorFlow实践

摘要&#xff1a;迁移学习是一种利用已有知识来改善新任务学习性能的方法。 在深度学习中&#xff0c;迁移学习通过迁移卷积网络&#xff08;CNN&#xff09;的预训练权重&#xff0c;实现了在新领域或任务上的高效学习。 下面我将详细介绍迁移学习的概念、实现思想&#xff0c…...

Ansible04-Ansible Vars变量详解

目录 写在前面6 Ansible Vars 变量6.1 playbook中的变量6.1.1 playbook中定义变量的格式6.1.2 举例6.1.3 小tip 6.2 共有变量6.2.1 变量文件6.2.1.1 变量文件编写6.2.1.2 playbook编写6.2.1.3 运行测试 6.2.2 根据主机组使用变量6.2.2.1 groups_vars编写6.2.2.2 playbook编写6.…...

Flutter 中的 SliverCrossAxisGroup 小部件:全面指南

Flutter 中的 SliverCrossAxisGroup 小部件&#xff1a;全面指南 Flutter 是一个功能丰富的 UI 开发框架&#xff0c;它允许开发者使用 Dart 语言来构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的丰富组件库中&#xff0c;SliverCrossAxisGroup 是一个较少被使用的组…...

开源还是闭源这是一个问题

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

数据结构与算法笔记:基础篇 - 栈:如何实现浏览器的前进和后退功能?

概述 浏览器的前进、后退功能&#xff0c;你肯定很熟悉吧&#xff1f; 当依次访问完一串页面 a-b-c 之后&#xff0c;点击浏览器的后退按钮&#xff0c;就可以查看之前浏览过的页面 b 和 a。当后退到页面 a&#xff0c;点击前进按钮&#xff0c;就可以重新查看页面 b 和 c。但…...

【AIGC】大型语言模型在人工智能规划领域模型生成中的探索

大型语言模型在人工智能规划领域模型生成中的新应用 一、引言二、LLM在规划领域模型生成中的潜力三、实证分析&#xff1a;LLM在规划领域模型生成中的表现四、代码实例&#xff1a;LLM在规划领域模型生成中的应用五、结论与展望 一、引言 随着人工智能技术的迅猛发展&#xff0…...

从零开始学习Slam-旋转矩阵旋转向量四元组(二)

本文参考&#xff1a;计算机视觉life 仅作笔记用 书接上回&#xff0c;上回不清不楚的介绍了旋转矩阵&旋转向量和四元组 现在回顾一下重点&#xff1a; 本着绕谁谁不变的变则 假设绕z轴旋转θ&#xff0c;旋转矩阵为&#xff1a; 再回顾一下旋转向量的表示以及这个基本记不…...

基于Spring Security添加流控

基于Spring Security添加流控的过程&#xff1a; 步骤1: 添加依赖 确保项目中包含了Spring Security和Sentinel-Core的相关依赖。在Maven项目中&#xff0c;可以在pom.xml中添加如下依赖&#xff1a; <!-- Spring Security --> <dependency><groupId>org.…...

Python | Leetcode Python题解之第119题杨辉三角II

题目&#xff1a; 题解&#xff1a; class Solution:def getRow(self, rowIndex: int) -> List[int]:row [1, 1]if rowIndex < 1:return row[:rowIndex 1]elif rowIndex > 2:for i in range(rowIndex - 1):row [row[j] row[j 1] for j in range(i 1)]row.inser…...

HP-Socket技术债务管理会议决策记录:选项、理由与结果

HP-Socket技术债务管理会议决策记录&#xff1a;选项、理由与结果 【免费下载链接】HP-Socket High Performance TCP/UDP/HTTP Communication Component 项目地址: https://gitcode.com/gh_mirrors/hp/HP-Socket 作为一款高性能TCP/UDP/HTTP通信组件库&#xff0c;HP-So…...

OpenClaw技能开发指南:为ollama-QwQ-32B编写自定义模块

OpenClaw技能开发指南&#xff1a;为ollama-QwQ-32B编写自定义模块 1. 为什么需要自定义技能开发 上周我需要每天手动查询三个城市的天气数据来生成日报&#xff0c;这种重复劳动让我开始思考&#xff1a;能否让OpenClaw帮我自动完成&#xff1f;当我发现现有的天气技能包都不…...

IntelliJ IDEA终极教程:从零基础到高效开发的完整指南

IntelliJ IDEA终极教程&#xff1a;从零基础到高效开发的完整指南 【免费下载链接】IntelliJ-IDEA-Tutorial IntelliJ IDEA 简体中文专题教程 项目地址: https://gitcode.com/gh_mirrors/in/IntelliJ-IDEA-Tutorial IntelliJ IDEA 是目前所有 IDE 中最具备沉浸式的 JVM …...

s2-pro GPU算力适配实战:显存优化部署让语音合成延迟降低40%

s2-pro GPU算力适配实战&#xff1a;显存优化部署让语音合成延迟降低40% 1. 专业语音合成新选择 s2-pro是Fish Audio开源的专业级语音合成模型镜像&#xff0c;它让高质量的文本转语音变得触手可及。与普通语音合成工具不同&#xff0c;s2-pro支持通过参考音频复用音色&#…...

大语言模型应用落地:从RAG到工作流,IT企业智能转型全攻略!

引言检索增强生成&#xff08;RAG&#xff09;微调&#xff08;Fine-Tuning&#xff09;智能体&#xff08;Agents&#xff09;工作流与流程编排&#xff08;Workflow&#xff09;企业落地策略与阶段规划落地难点与最佳实践建议结语引言大语言模型&#xff08;LLM&#xff09;技…...

cv_unet_image-colorization模型压缩与量化:面向移动端的部署优化

cv_unet_image-colorization模型压缩与量化&#xff1a;面向移动端的部署优化 想把那个能把黑白照片变彩色的AI模型塞进手机里&#xff1f;这听起来挺酷&#xff0c;但实际操作起来&#xff0c;你会发现它又大又慢&#xff0c;手机根本跑不动。这就像你想把一台高性能游戏电脑…...

在构建高并发、海量数据的分布式系统时,数据存储与治理是核心挑战。单机数据库的性能瓶颈、ID 冲突、历史数据膨胀等问题,都需要通过架构层面的设计来解决

在构建高并发、海量数据的分布式系统时&#xff0c;数据存储与治理是核心挑战。单机数据库的性能瓶颈、ID 冲突、历史数据膨胀等问题&#xff0c;都需要通过架构层面的设计来解决。 以下结合具体业务场景&#xff0c;深度解析分布式 ID、分库分表、数据迁移与冷热分离的内部机制…...

别再只会while(1)了!聊聊MCU裸机开发的6种实用架构,从51到STM32都能用

从超级循环到事件驱动&#xff1a;MCU裸机开发的6种架构实战指南 当你第一次点亮LED时&#xff0c;while(1)循环就像魔法一样简单有效。但随着项目复杂度增加——需要同时处理按键消抖、屏幕刷新、数据通信和状态管理时&#xff0c;那个曾经可靠的超级循环突然变成了意大利面条…...

RWKV7-1.5B-g1a实操手册:基于CSDN GPU平台的完整调用流程

RWKV7-1.5B-g1a实操手册&#xff1a;基于CSDN GPU平台的完整调用流程 1. 模型简介 rwkv7-1.5B-g1a 是基于新一代 RWKV-7 架构的多语言文本生成模型&#xff0c;特别适合中文场景下的轻量级应用。这个1.5B参数的版本在保持较高生成质量的同时&#xff0c;对硬件要求非常友好&am…...

DownKyi:B站视频下载工具的全方位技术解析与应用指南

DownKyi&#xff1a;B站视频下载工具的全方位技术解析与应用指南 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#x…...