注:源码版本:php5.6.33。
函数简介
原型:
说明:将一个字符串转换为数组。 参数: 为输入字符串。 是每一段的长度。
使用范例 :
以上例程会输出:
对应的C源码在 5568行。这里我贴出来:
zendparseparameters
首先看参数解析部分:
1、第一个参数我们使用默认值。下面是原因:
传递给 zendparseparameters() 的第一个参数是用户实际传递到函数的参数数量。此数值做为 ht 参数传给函数,但就像上面讨论的那样,应使用做为实现细节的 。为了与 PHP 的线程隔离、线程安全资源管理器兼容,还要用 传递线程上下文。与其他函数不同,它不能是最后的参数,因为在 内要求有不定数量的参数——依赖于要读取的用户参数的数量。
2、第二个参数定义所要求的参数。
每个参数都由字符串中的一个字符表示其类型。 如果希望一个字符串参数,则在此类型说明只不过是个 "s"。
这里的 表示接受一个字符串和它的长度,另外再取得一个可选的长整数。 表示可选。
相关所有类型说明符和对应的附加的 C 语言类型的文档可在源代码发布包中的文件 README.PARAMETERPARSINGAPI 中找到。大多数重要类型可见下表。
类型说明符
这几个比较常用,需要熟记。 比较特殊,需要用两个参数来接收。
如果有多个参数,类型说明符可以有多个。例如 表示取得一个长整数,一个字符串和它的长度,再取得一个 值。类型说明符还有几个特殊标记:
3、最后一个参数是传递一个或多个指针给要填充变量值的 C 变量,或提供更多细节。比如字符串,事实上的字符串,总是以 NULL 结尾,以 ,且其长度是除 字节外的 int 型值。
参考:
PHP: 函数的编写 - Manual
http://php.net/manual/zh/internals2.funcs.php
关于zendparseparameters函数 - 踏雪无痕SS - 博客园
https://www.cnblogs.com/chenpingzhao/p/4498829.html
函数返回值
PHP扩展开发里不是直接以 的形式返回值的,zend引擎在每个zif函数声明里加了一个 类型的形参,名为 ,专门来解决返回值这个问题。
本身并没有通过 关键字返回任何有价值的东西,它只不过是在运行时修改了 指针所指向的变量的值而已,而内核则会把 指向的变量作为用户端调用此函数 后的得到的返回值。 等宏是对一类操作的封装,展开后应该就是下面这样:
其它的还有:
再回头看 里的实现,我们发现没有使用 相关的宏进行返回。这是怎么回事呢?仔细看,发现使用 修改了 指针,我们追踪 代码:
继续展开:
原来 底层已经实现了 的功能。
phperrordocref
是一个错误抛出函数。还有一个 函数,它主要被Zend Engine使用,但也经常出现在扩展代码中。
两个函数都使用sprintf函数,比如格式化信息,因此错误信息可以包含占位符,那些占位符会被后面的参数填充。下面有一个例子:
参考:
【译】理解PHP内部函数的定义(给PHP开发者的PHP源码-第二部分) http://www.hoohack.me/2016/02/10/understanding-phps-internal-function-definitions-ch
arrayinitsize
初始化一个数组,指定初始化数组的元素个数。该函数定义在Zend_API.h里。
代码里:
初始化了一个数组,大小为字符串分段长度:最终分为几部分,使用向上取整方法。
用向上取整的计算公式为 : (a-1)/b+1 。
参考:
array_init
该函数与arrayinitsize用法相似,只是不用指定数组大小。该函数用于初始化一个空数组。
示例:
addnextindex_stringl
将数组初始化后,接下来就要向其添加元素了。
函数原型:
该函数就是给指定数组增加一个元素,该元素是字符串类型,其中length参数指的是截取的str的长度。该函数是二进制安全的。
代码里多次用到这个函数:
领取专属 10元无门槛券
私享最新 技术干货