PHP源码阅读(一):str

注:源码版本: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的长度。该函数是二进制安全的。

代码里多次用到这个函数:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181014G12ULI00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券