最佳实践系列(九):PHP 多字节字符串处理函数及字符编码

mbstring 扩展 我们所说的多字节字符指的是不在传统的 128 个 ASCII 字符集中的字符,比如中文字符。而 PHP 中处理字符串的函数默认假设所有字符都是 8 位字符,占用一个字节,如果使用这些 PHP 原生的字符串处理函数处理包含多字节字符的 Unicode 字符串,会得到意料之外的错误结果。 为了避免处理多字节字符出错,可以安装 mbstring 扩展。这个扩展提供了处理…

[ PHP 内核与扩展开发系列] 函数的参数:arginfo 与类型绑定

在前面的章节中我们已经介绍过 arginfo 了,下面我们看一下如何通过其实现类型绑定,但这个特性只能在 Zend Engine 2 也就是 PHP 5 中使用。 让我们再回顾一下 arginfo 的结构,每一个 arginfo 结构的声明都是通过 ZEND_BEGIN_ARG_INFO() 或者 ZEND_BEGIN_ARG_INFO_EX() 宏函数开始的,然后紧跟着几行 ZEND_…

[ PHP 内核与扩展开发系列] 函数的参数:zend_parse_paramenters

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

[ PHP 内核与扩展开发系列] 函数返回值:引用参数与函数的执行结果

一个函数的执行结果要返回给调用者,除了使用 return 功能,还有一种办法,那就是以引用的形式传递参数,然后在函数内部修改这个参数的值。前一种方法往往只能返回一个值,如果我们的函数执行结果具有多种数据,便需要把这些数据打包到一个数组、类等复合类型的变量中才能得以实现;但后一种方法相比而言就简单一些了。 运行时传递引用 标题有点绕口,其实很简单,功能如以下所示: <?php fun…

[ PHP 内核与扩展开发系列] 函数返回值:一个特殊的参数 —— return_value

引入 return_value PHP 语言中函数的返回值是通过 return 来完成的,就像下面的程序: <?php function sample_long() { return 42; } $bar = sample_long(); C 语言也一样使用 return 关键字: int sample_long(void) { return 42; } int main(void…

[ PHP 内核与扩展开发系列] 第一个 PHP 扩展:编写函数

前面我们已经生成好了一份扩展框架,但它是没有什么实际作用。一个扩展的作用可大了去了,既可以操作 PHP 中的变量、常量,还可以定义函数、类、方法、资源等。先让我们从函数说起吧! ZEND_FUNCTION()宏函数 ZEND_FUNCTION() 宏函数也可以写成 PHP_FUNCTION(),但 ZEND_FUNCTION() 更前卫、标准一些,但两者是完全相同的。 #define P…