php7 有ext skel吗,PHP扩展开发系列02 - 老司机起步之函数

上一篇扩展开发引导文章中。创建了编写扩展的三个基本文件。或许你会有个疑问

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 什么事了。至于其他参数 自行了解。

bVOxyp?w=385&h=339

发现也是有这三个文件的。至于文件里面的内容呢。那肯定跟上次自己写的文件内容不同。不然我岂不是神?

说明下,对比下我们自己写的三个文件 与 自动生成的。

不该少的没少

多的先不管

关键地方不同的没事

其实也相同(宏、宏、宏)

我们自己写的也能生成扩展,也能生效。

所以,不要质疑自己。

后面的项目结构以自己写的为主,也就是说不会用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");

}

参考

结束

到目前看来这个司机进化了一点,算是有点本事(函数),也会隐藏自己(函数别名).

不过还不够,参数?返回值?不急,休息下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值