[ 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…

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

我们已经在上一节准备好了需要编译的源文件,接下来需要的便是把它们编译成目标文件了。 在 *nix 下编译安装 第一步:我们需要根据 config.m4 文件生成 configure 脚本、Makefile 等文件,这一步由 phpize 来帮我们做: $ /usr/local/php54/bin/phpize Configuring for: PHP Api Version: 20100…

如果在所有 Laravel 项目中只安装一个扩展包,你会选择哪一个?

Mike Erickson (@codedungeon) 在 Twitter 上提出了这个问题,吸引了很多回复。我个人感觉由 Barry vd. Heuvel 开发的 Debugbar 将会获取最高票,结果果不其然,它获取了最多推荐。 下面是人们推荐的扩展包列表: Debugbar Laravel Debugbar 是一个让你在开发期间可以便捷查看应用所有信息的扩展包,以方便调试。 ID…

[ PHP 内核与扩展开发系列] 第一个 PHP 扩展:扩展的基本结构

每一个 PHP 扩展都至少需要两个文件:一个配置文件和一个源文件。配置文件用来告诉编译器应该编译哪几个文件,以及编译本扩展是否需要的其它库。 配置文件 才开始,我们先用最快的(不是最标准的)的方式来建立一个代码最少的扩展。在 PHP 源码文件夹的 ext 目录下创建一个新的文件夹,这里我取的名字叫做 academy,它往往就是我们扩展的名字。其实这个文件夹可以放在任何一个位置,但是为了我…

[ PHP 内核与扩展开发系列] 配置编译环境并编译安装 PHP

准备工作 从一个 PHP 程序员,到一个想为 PHP 开发扩展的程序员,此间的进化有一步是跳不过去的,那就是你必须熟知如何编译 PHP 的源码。 *nix Tools C 语言的编译器是我们使用 C 语言的必备工具,你的系统应该已经自带了一种 C 语言的编译器,而且它极有可能是大名鼎鼎的 gcc。通过检测你本机 gcc 或者 cc 程序的版本,可以很方便的知道你机器上是否已经安装的某种 …

[ PHP 内核与扩展开发系列] 内存管理 —— 引用计数

对于 PHP 这种需要同时处理多个请求的程序来说,申请和释放内存的时候应该慎之又慎,一不小心便会酿成大错。另一方面,除了要安全申请和释放内存外,还应该做到内存的最小化使用,因为它可能要处理每秒钟数以千计的请求,为了提高系统整体的性能,每一次操作都应该只使用最少的内存,对于不必要的相同数据的复制则应该能免则免。我们来看下面这段 PHP 代码: <?php $a = ‘Hello Wo…

[ PHP 内核与扩展开发系列] 内存管理 —— 内存分配与释放

在 PHP 里,我们可以定义字符串变量,比如 <?php $str=”hello”;?>,$str 这个字符串变量可以被自由的修改与复制。这一切在 C 语言里看起来都是不可能的事情,我们用 char *p = “hello”; 来定义一个字符串,但它是常量,是不能被修改的,如果你用 p[1]=’c’; 来修改这个字符串会引发段错误,为了修改 C 语言里的字符串常量,我们往往需…

[ PHP 内核与扩展开发系列] 变量在内核中的实现 —— 类型转化

现在我们已经可以从符号表中获取用户在 PHP 语言里定义的变量了,是时候该做点其它事情了,举个例子,比如给它来个类型转换。想想 C 语言中的类型转换细则,你的头是不是已经大了?但是变量的类型转换就是如此重要,如果没有,那我们的代码就会是下面这样了: void display_zval(zval *value) { switch (Z_TYPE_P(value)) { case IS_NU…