PHP底层实现源码阅读笔记(4)

在能够编译PHP内核代码的基础上,今天写点代码来练习练习。

(如何在Windows下编译PHP7,可以参考这里: http://my.oschina.net/u/134395/blog/539378  )

很多介绍写PHP扩展的文章,都是重新写一个扩展。因为涉及到很多知识点,常常把人看得糊涂。今天玩儿个简单但又不失有趣的练习:给PHP内核增加一个标准函数。

1、PHP自带了很多标准函数,其实现在: E:\LearnPHP7\dev\vc14\x86\src\ext\standard 目录中 。

2、为了能迅速玩起来,我采用了直接在现有的文件上新增代码。 

3、我给PHP新增一个标准函数: psi_version()   这个函数没有参数,调用后返回 整数 2016 。 一个超级无厘头的函数。

4、在 E:\LearnPHP7\dev\vc14\x86\src\ext\standard\php_math.h 中新增代码

PHP_FUNCTION(psi_version);

 5、在 E:\LearnPHP7\dev\vc14\x86\src\ext\standard\math.c 中新增代码

PHP_FUNCTION(psi_version)
{
	RETURN_LONG(2016);
}

 上述两步中的代码,用了PHP内核代码中特有的宏,但是其含义一眼就能猜出来。

6、步骤 4和5 只是定义了C代码中的函数,为了能在PHP脚本中能调用这个函数,需要告诉PHP内核引擎这个函数的存在。

在basic_function.c 中找到 basic_functions[] 。把代码修改成下面

ZEND_BEGIN_ARG_INFO(arginfo_psi_version, 0)
ZEND_END_ARG_INFO()

const zend_function_entry basic_functions[] = { /* {{{ */	
    PHP_FE(psi_version,     arginfo_psi_version)	
    PHP_FE(constant,        arginfo_constant)
    // 下面原来的代码就省略了
    // ...

上面代码的含义是:

用宏ZEND_BEGIN_ARG_INFO和ZEND_END_ARG_INFO定义了psi_version的入口参数。

用宏PHP_FE把 psi_version注册到PHP内核 (FE应该是 Function Entry的缩写)。

PHP底层实现源码阅读笔记(4)_第1张图片

7、用nmake编译PHP内核代码

8、用编译后的php.exe执行下面的PHP脚本

<?php

echo psi_version();

9、have fun !

写这样一个无厘头的函数有什么价值呢?

1、能快速地玩起来。

2、更复杂的函数是在这个基础上的演化。

3、可以猜测到的是:更复杂的函数写法,就是要学会在内核扩展代码中如何获得函数参数和返回各种类型的函数结果值。

这个目前我也还在学习中,会逐步整理成博客。

4、上述这个玩法,我并没有看别的资料,只是阅读代码后凭着直觉写的。印证了我的很多猜测,很好玩,也能让我有兴趣探索更多的代码。

QQ群:108111233

你可能感兴趣的:(PHP底层实现源码阅读笔记(4))