上一篇扩展开发引导文章中。创建了编写扩展的三个基本文件。或许你会有个疑问
PHP没有类似的自动生成项目框架的工具吗? 当然有。
这篇文章就开始介绍使用 "php-ext-cli" 工具来生成扩展项目文件
注意这里的 "php-ext-cli" 本身没有这玩意,是我给 PHP 自带的起的别名
这个工具就是 php-src/ext/ext_skel
还有点迷惑? 那不废话了。
顺便给那个只会装逼的司机加个功能(函数吧)
下载(领车)
我用的是 php 5.6.30版本
不要纠结版本,当然也先别直接用 php7.x 版本
解压(开门)
tar zxf php-5.6.30.tar.gz
进入ext(上车)
cd php-src/ext/
ext目录中内容
目录内很多文件夹和文件 (车内豪华装饰)
需要关心的暂时有:
ext_skel
其他扩展的文件夹
其他的先不管咯。
ext_skel 使用
./ext_skel
☁ ext [PHP-5.6.30] ⚡ ./ext_skel
./ext_skel --extname=module [--proto=file] [--stubs=file] [--xml[=file]]
[--skel=dir] [--full-xml] [--no-help]
--extname=module module is the name of your extension
--proto=file file contains prototypes of functions to create
--stubs=file generate only function stubs in file
--xml generate xml documentation to be added to phpdoc-svn
--skel=dir path to the skeleton directory
--full-xml generate xml documentation for a self-contained extension
(not yet implemented)
--no-help don't try to be nice and create comments in the code
and helper functions to test if the module compiled
还只是先关心下 --extname 参数
./ext_skel --extname=laosiji
最简单的理解就是 生成 一个 laosiji 的扩展项目
对比
执行完 ./ext_skel --extname=laosiji 之后 就在 ext 目录下生成一个 laosiji的目录
进去看看咯
对了 暂时没 ext_skel 什么事了。至于其他参数 自行了解。
发现也是有这三个文件的。至于文件里面的内容呢。那肯定跟上次自己写的文件内容不同。不然我岂不是神?
说明下,对比下我们自己写的三个文件 与 自动生成的。
不该少的没少
多的先不管
关键地方不同的没事
其实也相同(宏、宏、宏)
我们自己写的也能生成扩展,也能生效。
所以,不要质疑自己。
后面的项目结构以自己写的为主,也就是说不会用ext_skel的来。其实都一样,区别在于更少
不废话了,以上只是简单提下 ext_skel 的使用说明
函数
定义
// 函数定义
ZEND_FUNCTION(laosiji_hello)
{
php_printf("hello laosiji!\n");
}
声明
ZEND_FUNCTION(laosiji_hello);
使用
// functions entry 函数模块
static zend_function_entry laosiji_functions[] = {
ZEND_FE(laosiji_hello, NULL) // 声明
{NULL, NULL, NULL} // 固定不变的 照着写就行了
};
// module entry
zend_module_entry laosiji_module_entry = {
// ...
laosiji_functions, /* Functions 载入函数模块*/
// ...
};
@函数别名
既然是别名就不存在定义声明咯 只要....就行了
static zend_function_entry laosiji_functions[] = {
ZEND_FE(laosiji_hello, NULL) // 声明
ZEND_NAMED_FE(laosiji_hi, ZEND_FN(laosiji_hello), NULL) // 函数别名 ZEND_NAMED_FE
ZEND_FALIAS(laosiji_hehe, laosiji_hello, NULL) // 函数别名 ZEND_FALIAS
{NULL, NULL, NULL} // 固定不变的 照着写就行了
};
测试
@dl('laosiji.so');
laosiji_hello();
laosiji_hi();
laosiji_hehe();
完整代码
php_laosiji.h
// 定义 扩展相关的宏 比如版本号 扩展名称等等。。
#define PHP_LAOSIJI_EXTNAME "laosiji"
#define PHP_LAOSIJI_VERSION "1.0.0"
//加载config.h,如果配置了的话
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
// 加载php头文件
// 这个 很有必要哈
#include "php.h"
// 多了个函数声明哈
ZEND_FUNCTION(laosiji_hello);
laosiji.c
#include "php_laosiji.h"
// functions entry 函数模块
static zend_function_entry laosiji_functions[] = {
ZEND_FE(laosiji_hello, NULL) // 声明
ZEND_NAMED_FE(laosiji_hi, ZEND_FN(laosiji_hello), NULL) // 函数别名 ZEND_NAMED_FE
ZEND_FALIAS(laosiji_hehe, laosiji_hello, NULL) // 函数别名 ZEND_FALIAS
{NULL, NULL, NULL} // 固定不变的 照着写就行了
};
// module entry
zend_module_entry laosiji_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
PHP_LAOSIJI_EXTNAME, /* 扩展名称 */
laosiji_functions, /* Functions 载入函数模块*/
NULL, /* MINIT */
NULL, /* MSHUTDOWN */
NULL, /* RINIT */
NULL, /* RSHUTDOWN */
NULL, /* MINFO */
#if ZEND_MODULE_API_NO >= 20010901
PHP_LAOSIJI_VERSION, /* 扩展版本 */
#endif
STANDARD_MODULE_PROPERTIES};
#ifdef COMPILE_DL_LAOSIJI
ZEND_GET_MODULE(laosiji)
#endif
// 函数定义
ZEND_FUNCTION(laosiji_hello)
{
php_printf("hello laosiji!\n");
}
参考
结束
到目前看来这个司机进化了一点,算是有点本事(函数),也会隐藏自己(函数别名).
不过还不够,参数?返回值?不急,休息下