PHP内核之zend_parse_parameters

Microsoft AI SDK 与 SAP ABAP:让企业级 AI 能力触手可及的深度整合指南 借助 Microsoft AI SDK,ABAP 开发者无需跳出熟悉的事务码与数据字典,就能把 GPT‑4 的强大语言理解与生成能力深度植入采购、销售、财务等核心业务流程。只要掌握“初始化 SDK → 构造 Prompt → 解析输出”这一范式,未来无论 Azure OpenAI、OpenAI 还是本地化 LLM,都能在同一套代码骨架内快速切换,实现真正的“AI 即服务”。现在,就让我们在下一行 ABAP 里拥抱智能未来。参考链接均于 2025‑07‑22 提取,推荐读者结合实际版本进一步验证。 阅读详情

函数介绍

关于zend_parse_parameters函数的使用,网上已经有很多的介绍了。函数的原型定义在zend_API.c中,为:

ZEND_API int zend_parse_parameters(int num_args,const char *type_spec,....),

num_args表示参数的个数,通过使用ZEND_NUM_ARGS()获取而不手动计算传入。第二个参数type_spec是规定传入值的类型,比较常用的就是s代表字符串,l代表long int。


例子的疑惑

网上最多的一个列子如下(最权威的例子可以到php源码中的README.PARAMETER_PARSING_API中查看,有详细介绍):

PHP_FUNCTION(test){
    char *s;
    size_t s_len;
if(zend_parse_paramters(ZEND_NUM_ARGS(),"s",&s,&s_len) == FAILURE){
    return;
}
php_printf("we get %s",s);
}

上面例子是针对字符串赋值的,对于一个C小白来说,疑惑的是为什么定义一个字符串指针变量s后,传入zend_parse_parameters函数中的是指针变量s的地址。如果是针对long int数据赋值,那么语法应该是这样的:

PHP_FUNCTION(test){
    zend_long a;
if(zend_parse_paramters(ZEND_NUM_ARGS(),"l",&a) == FAILURE){
    return;
}
php_printf("we get %d",a);
}

这个我可以理解,就是常见的通过向函数传入外部变量的地址,达到修改外部变量的效果。那么为什么字符串和整形传递的类型不一样,这里涉及到了变量在php7中的存储方式,也就是ZVAL结构。首先我们来看整型和字符串型在zend_parse_parameters函数中分别是怎么处理的,主要的区别就在于最后对参数赋值时(两个函数均定义在zend_API.h中)

long int:

zend_long *p = va_arg(*va,zend_long *);
zend_parse_arg_long(arg,p,is_null,check_null,c=='L');

string:

char **p = va_arg(*va,char **);
zend_parse_arg_string(arg,p,pl,check_null)

从这里定义的变量p可以看出,字符串中获取的参数就必须是双重指针了。但这并不是理由,真正的原因在于zval中string和long int的存储方式。让我们先看zend_parse_arg_long函数:

int zend_oarse_arg_long(zavl *arg,zend_long *dest,zend_bool *is_null,int check_null,int cap){
if(EXPECTED(Z_TYPE_P(arg) == IS_LONG)){
*dest = Z_LVAL_P(arg);}}

Z_TYPE_P宏的功能是根据zval指针变量判断该zval的数据类型。Z_TYPE_PP则是根据指向zval指针变量的指针变量判断zval类型。如果类型正确,则执行Z_LVAL_P(arg),这个宏的展开为:

#define Z_LVAL_P(zval_p)   *(zavl_p).value.lval

关于这些zval相关的宏,大多定义在zend_types.h文件中,一些特定类型的就在对应的文件中,比如ZSTR_VAL(zstr)定义在zend.string.h文件中。那么对于long int这个例子:

*dest = Z_LVAL_P(arg)
等价于
zend_long a = *(zavl_p).value.lval

这里需要明白,对于简单数据类型:long,int等类型,是直接存储在zval结构中的value中的:

zval简图如下:

struct _zval_struct {
    zend_value  value;
    union {
    .....
    }u1;
    union {
    .....
    }u2;
    
}

zend_value简图如下:

typdef union _zend_value {
    zend_long   lval;
    zend_string   *str;
    zend_array   *arr;
    .....;
    struct {
    ...
    }ww;
}zend_value;
从上面的zval结构可知,long类型可以直接在zval.value.lval中获取,而一些复合结构如string,arr则需要再根据存储的地址去取值。


下面再看函数zend_parse_arg_string:

int zend_parse_arg_string(zval *arg,zend_string **dest,int check_null){
    zend_string *str;
  if(!zend_parse_arg_str(arg,&str,check_null)){
      return 0;
    }
      *dest = ZSTR_VAL(str);
      *dest_len = ZSTR_LEN(str);
}

函数中,先将参数的值通过函数zend_parse_arg_str进行解析,即通过zval指针变量获取到zval中vlaue.str的值。

zend_parse_arg_str定义如下:

int zend_parse_arg_str(zval *arg,zend_string **dest,int check_null){
   if(EXPECTED(Z_TYPE_P(arg) == IS_STRING)){
   *dest = Z_STR_P(arg);
}
}

宏Z_STR_P(arg)等价于*(arg).value.str。所有当前的str指针变量指向了一个zend_string结构体。

最后的ZSTR_VAL和ZSTR_LEN宏就是对zend_string结构体中的数据进行提取。

ZSTR_VAL(str) = (str)->val;
ZSTR_LEN(str) = (str)->len

其实通过看zend_string结构体的结构你就知道这个宏是怎么回事了。如下:

struct _zend_string {
    zend_refcounted_h gc;
    zend_ulong h;
    size_t len;
    char val[1];
}

所以,像string,array等复合类型数据最后传递给参数的都是一个地址,那参数s也肯定得是一个指针变量来存储一个地址,而对于int,long等简单类型,最后传递给参数的是一个值。因此定义一个对应的类型参数就可以用来接收数据了。

至此,关于zend_parse_parameters的介绍就告一段落。

17、自适应和学习索引:在线物理设计调整的新维度 本文探讨了现代数据库管理系统中自适应索引和数据库裂解的新方法,通过结合学习模型与多臂老虎机(MAB)框架,实现在线物理设计调整。文章详细介绍了自适应索引的工作原理、数据库裂解技术以及如何利用机器学习进行索引选择和优化,并讨论了MAB框架在动态调整索引结构中的应用及其实际案例。 阅读详情

相关推荐

使用VLC库实现视频播放器(WPF版)

使用wpf制作一个视频播放器 一、 LibVLCSharp介绍 LibVLCSharp是基于VideoLAN的LibVLC库的.NET平台的跨平台音频和视频API。它提供了一个全面的多媒体API,可以跨移动、服务器和桌面使用,以呈现视频和输出音频。支持Mono、.NET Framework和.NET核心运行时。在vs工具中,只需要安装截图中得两个nuget包。 二、视频播放器的实现 视频播放器的实现需要用到两个比较nuget包中提供的类,MediaPlayer类。MediaPlayer类型用于控

cangqiongxiaoye的博客 1万+

zend_parse_parameters

http://www.walu.cc/phpbook/7.1.md 最简单的获取函数调用者传递过来的参数便是使用zend_parse_parameters()函数。 zend_parse_parameters()函数的前几个参数我们直接用内核里宏来生成便可以了,形式为:ZEND_NUM_ARGS() TSRMLS_CC,注意两者之间有个空格,但是没有逗号。从名字可以看出,ZEND_NUM

leonpengweicn的专栏 1220

C语言图形化界面——含图形、按钮、鼠标、进度条等部件制作(带详细代码、讲解及注释)

本文借助easyx库函数(提供下载链接),很方便地用C语言实现了鼠标、按钮、进度条、坐标尺等操作,为普通C程序的友好人机交互界面提供了一种简单便捷的方案。

体会编程语言独到的美 17万+

Zend扩展开发:Zend API:Zend_parse_parameters

Zend API:Zend_parse_parameters 对于扩展来说,最重要的一件事就是如何接收和处理那些通过函数参数传递而来的数据。大多数扩展都是用来处理某些特定的输入数据(或者是根据参数来决定进行某些特定的动作),而函数的参数则是 PHP 代码层和 C 代码层之间交换数据的唯一途径。当然,你也可以通过事先定义好的全局变量来交换数据(这个我们稍后会谈到),不过这种习惯可不太好,我们应

youlinggu的专栏 2613

车载LIN总线避坑指南:主从节点通信失败的5个常见原因及解决方案

本文深度解析车载LIN总线主从节点通信失败的五大常见原因,涵盖物理层信号异常、调度表冲突、LDF配置错误、节点状态机缺陷及环境干扰。重点剖析了LDF文件配置不一致、波特率不匹配等关键问题,并提供了从示波器波形分析到软件配置检查的完整实战排查路径,帮助工程师高效定位并解决LIN通信故障。

g9h0i1的博客 1252

使用Hyper-V使用下载下来的macOS安装引导安装macos

然后关闭工具返回安装界面选择第二个reinstall,选择119g那个硬盘。我的资源上传了:macOS Monterey on Hyper-V.7z。设置固件的启动顺序,引导安装盘放到第一位,mac安装110g放第二。选择disk utility格式化那个110g。下载解压的macos引导挂载到虚拟硬盘。其他设置安全禁用,检查禁用,集成都选中。新建一个虚拟硬盘装mac,110g。

viviliving的专栏 3025

Zend API:Zend_parse_parameters

对于扩展来说,最重要的一件事就是如何接收和处理那些通过函数参数传递而来的数据。大多数扩展都是用来处理某些特定的输入数据(或者是根据参数来决 定进行某些特定的动作),而函数的参数则是 PHP 代码层和 C 代码层之间交换数据的唯一途径。当然,你也可以通过事先定义好的全局变量来交换数据(这个我们稍后会谈到),不过这种习惯可不太好,我们应该尽量避免。 在 PHP 中并不需要做...

weixin_33795833的博客 239

lammps构建高熵合金模型+结构优化初步筛选能量最小的结构

lammps构建高熵合金模型+结构优化初步筛选能量最小的结构

qq_45834835的博客 2605

PHP内核探索:zend_parse_parameters函数

转载地址:http://www.nowamagic.net/librarys/veda/detail/1467 最简单的获取函数调用者传递过来的参数便是使用zend_parse_parameters()函数。 zend_parse_parameters()函数的前几个参数我们直接用内核里宏来生成便可以了,形式为:ZEND_NUM_ARGS() TSRMLS_CC,注意两者之间有个空格,但是

zhxp_870516的专栏 1013

学Simulink——基于大数据处理与云计算的场景实例:无人机与云计算中心之间的高效数据传输链路设计

本文以无人机与云计算中心的高效数据传输链路设计为例,手把手指导使用Simulink进行系统级建模。针对智慧城市、灾害监测等场景中无人机采集的海量数据(视频、图像、点云等),构建包含数据源、传输协议、无线链路、云接入和性能分析的五层架构模型。通过智能数据压缩、多链路聚合和QoS优先级调度等关键技术,实现5G+Wi-Fi等多通信技术的自适应切换。仿真结果表明,5G+Wi-Fi链路聚合在城市环境中表现最优,而4G+卫星组合适合偏远地区。该模型为无人机实时数据传输提供了有效的设计方法和优化方向,可拓展至边缘计算、A

xiaoheshang_123的博客 120

【PowerBI专栏】PowerBI导入MYSQL数据库

本文介绍了在PowerBI中连接MySQL数据库的方法。首先需要下载并安装MySQL官方.NET连接驱动(推荐8.4.0版本),安装完成后重启PowerBI。连接时需填写服务器IP和数据库名称等必填参数。文章详细说明了连接配置步骤,包括账户设置、数据表选择以及可能遇到的数据格式转换问题处理。最后指导用户完成数据清洗后进入PowerPivot进行后续计算。特别提醒最新9.4版本可能存在兼容性问题,建议使用稳定的8.4版本连接器。

技术与管理的平衡木- 696

zend_parse_parameters函数

留给自己以后不懂看最简单的获取函数调用者传递过来的参数便是使用zend_parse_parameters()函数。zend_parse_parameters()函数的前几个参数我们直接用内核里宏来生成便可以了,形式为:ZEND_NUM_ARGS() TSRMLS_CC,注意两者之间有个空格,但是没有逗号。从名字可以看出,ZEND_NUM_ARGS()代表这参数的个数。紧接着需要传递个zend_pa...

ab17171313的博客 589

【推荐100个unity插件】Animator 的替代品?—— Animancer Pro插件的使用介绍

Animancer与Unity Animator对比及使用指南 摘要: 本文对比了Animancer与Unity官方Animator的核心差异,分析了Animancer的优势特点。Animancer采用代码驱动模式,相比Animator的状态机系统更灵活高效,支持实时调试、动态混合和深度逻辑集成。文章详细介绍了Animancer的快速使用方法,包括动画播放、切换和触发机制,并区分了免费版与专业版的功能差异。适合需要高效动画开发、复杂交互逻辑的中小项目,为开发者提供了一种现代化的动画解决方案。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2434

六十、PHP内核探索:zend_parse_parameters函数 ☞ 获取函数调用者传递过来的参数

最简单的获取函数调用者传递过来的参数便是使用zend_parse_parameters()函数。 zend_parse_parameters()函数的前几个参数我们直接用内核里宏来生成便可以了,形式为:ZEND_NUM_ARGS() TSRMLS_CC,注意两者之间有个空格,但是没有逗号。从名字可以看出,ZEND_NUM_ARGS()代表这参数的个数。 紧接着需要传递个zend_parse_p...

进阶之旅 404

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

php zend_parse_parameters有什么作用,PHP内核探索:zend_parse_parameters函数

最简单的获取函数调用者传递过来的参数便是使用zend_parse_parameters()函数。zend_parse_parameters()函数的前几个参数我们直接用内核里宏来生成便可以了,形式为:ZEND_NUM_ARGS() TSRMLS_CC,注意两者之间有个空格,但是没有逗号。从名字可以看出,ZEND_NUM_ARGS()代表这参数的个数。紧接着需要传递个zend_parse_param...

weixin_28954201的博客 223

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

php getnumberofparameters,PHP内核探索:zend_parse_parameters函数

最简单的获取函数调用者传递过来的参数便是使用zend_parse_parameters()函数。zend_parse_parameters()函数的前几个参数我们直接用内核里宏来生成便可以了,形式为:ZEND_NUM_ARGS() TSRMLS_CC,注意两者之间有个空格,但是没有逗号。从名字可以看出,ZEND_NUM_ARGS()代表这参数的个数。紧接着需要传递个zend_parse_param...

weixin_39539002的博客 189

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

辅助解读PHP源码 ZEND_PARSE_PARAMETERS_START函数 __FAST ZPP方式

FAST ZPP FAST ZPP相应的宏方法可以查看官方网站 https://wiki.php.net/rfc/fast_zpp 不建议删除现有的API,但是在PHP7中提供了新方式。提高了参数解析的性能,建议仅对最常用的函数使用FAST ZPP方式。 ZEND_PARSE_PARAMETERS_START(2, 4) Z_PARAM_ARRAY(输入) Z_PARAM_LONG(偏移量) Z_PARAM_OPTIONAL Z_PARAM_ZVAL(z_length) Z_PARAM_BOOL(

Suruin的博客 605

php中安装添加自定义的C扩展程序-ext_skel工具及php扩展程序开发中的参数接受及处理-zend_parse_parameters函数及nginx指令、内核参数优化等

publish:May 13, 2019 -Monday 扩展程序就你是PHP内置的程序,和php代码执行不一样,扩展程序在php进程启动时便已自动加载,所以其执行效率和性能比PHP代码高很多。多年前在硬件资源很受限的时代,程序员总是要想尽办法省资源提升代码性能,但现在硬件越来越廉价,对代码性能的极致得升已经变得越来越少考虑的事情了,也许有一些大公司还在使用自己的C扩展吧,对于一般的公司而言,着实没有必要去搞自己的C扩展程序,毕竟使用自定义的C扩展程序维护起来会很麻烦。

本博客记录了从2014年以来在工作学习中遇到的技术问题、解决方法以及部分个人人生经历、经验等内容。 1547

PHP7内核剖析 学习笔记 第十章 扩展开发(2)

内部函数是C语言定义的函数,其局部变量是C语言中的变量,不会分配在zend_execute_data上,但其参数会分配在zend_execute_data上,即内部函数的zend_execute_data里只有参数,没有其他变量。zend_parse_paramters()调用了zend_parse_va_args(),zend_parse_va_args()中首先做了简单的检查,如检查必传参数数量,然后依次获取zend_execute_data中存储的参数,根据不同类型进行相应的解析。

tus00000的博客 452

c写php扩展传参学习记录

最简单的获取函数调用者传递过来的参数便是使用zend_parse_parameters()函数。 zend_parse_parameters()函数的前几个参数我们直接用内核里宏来生成便可以了,形式为:ZEND_NUM_ARGS() TSRMLS_CC,注意两者之间有个空格,但是没有逗号。从名字可以看出,ZEND_NUM_ARGS()代表这参数的个数。 紧接着需要传递个zend_par

double--water专栏 646

php 变量代码,PHP变量的类型

[php]代码库//开始定义php语言中的函数gettypePHP_FUNCTION(gettype){//这个arg间接指向就是我们传给gettype函数的参数。是一个zval**结构//所以我们要对他使用__PP后缀的宏。zval **arg;//这个if的操作主要是让arg指向参数~if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z...

weixin_39752828的博客 126

php方案 ZEND_PARSE_PARAMETERS高级用法

【代码】php方案 ZEND_PARSE_PARAMETERS高级用法。

qq_37805832的博客 41

php内核 内核新增自研内置函数实现方法

【代码】php内核 内核新增自研内置函数实现方法。

qq_37805832的博客 190

php 扩展学习笔记

zval *name;# 申明一个zval变量 MAKE_STD_ZVAL(zval);#申明一个变量,并分配内存 #php内核解析参数 zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &zval) ==FAILURE #下面是类型的列表 Type Code Variable Type Boolean b zend

baixiaoshi的专栏 1120

PHP源码阅读-Part3-变量

  注:这篇文章的内容出自ircmaxell的博客,这里只是翻译整理一下!   这节我们将继续在上节的基础上,探讨PHP的内核实现,上节主要讲了如何在PHP源码中找到一个PHP函数的实现, 并以strpos函数为例,简要分析了它的实现过程。这节我们主要分析一下PHP中的变量,即源码中随处可见的zval类型。 走进zval   PHP是一种弱类型语言,不需要变量的类型声明,解释器会根...

a83719716的博客 106

原:PHP数组函数研究:is_null,is_object,is_array,is_string,is_resource等

声明:本文为斯人原创,全部为作者一一分析得之,有不对的地方望赐教。 欢迎转载,转载请注明出处 。 本文地址:http://imsiren.com/archives/516 前面有一篇文章 讲的是PHP内核源码分析:isset与 empty 但是好像忘记了一系列is函数 如 is_null,is_object,is_array,is_string,is_resource...

dengbaoleng 261
上一篇: PHP常说的SAPI是什么
下一篇: php源码之array_key_exists
jj_jameholl
博客等级 码龄10年 5粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值