资讯专栏INFORMATION COLUMN

PHP扩展开发系列02 - 老司机起步之函数

cloud / 554人阅读

摘要:上一篇扩展开发引导文章中。这篇文章就开始介绍使用工具来生成扩展项目文件注意这里的本身没有这玩意,是我给自带的起的别名这个工具就是还有点迷惑那不废话了。至于其他参数自行了解。发现也是有这三个文件的。所以,不要质疑自己。

</>复制代码

  1. 上一篇扩展开发引导文章中。创建了编写扩展的三个基本文件。或许你会有个疑问
    PHP没有类似的自动生成项目框架的工具吗? 当然有。
    这篇文章就开始介绍使用 "php-ext-cli" 工具来生成扩展项目文件
    注意这里的 "php-ext-cli" 本身没有这玩意,是我给 PHP 自带的起的别名
    这个工具就是 php-src/ext/ext_skel
    还有点迷惑? 那不废话了。
    顺便给那个只会装逼的司机加个功能(函数吧)

下载(领车)

我用的是 php 5.6.30版本
不要纠结版本,当然也先别直接用 php7.x 版本

https://github.com/php-src/php

http://php.net/downloads.php

解压(开门)

tar zxf php-5.6.30.tar.gz

进入ext(上车)

cd php-src/ext/

ext目录中内容

目录内很多文件夹和文件 (车内豪华装饰)
需要关心的暂时有:

ext_skel

其他扩展的文件夹

其他的先不管咯。

ext_skel 使用

./ext_skel

</>复制代码

  1. ☁ ext [PHP-5.6.30] ⚡ ./ext_skel
  2. ./ext_skel --extname=module [--proto=file] [--stubs=file] [--xml[=file]]
  3. [--skel=dir] [--full-xml] [--no-help]
  4. --extname=module module is the name of your extension
  5. --proto=file file contains prototypes of functions to create
  6. --stubs=file generate only function stubs in file
  7. --xml generate xml documentation to be added to phpdoc-svn
  8. --skel=dir path to the skeleton directory
  9. --full-xml generate xml documentation for a self-contained extension
  10. (not yet implemented)
  11. --no-help don"t try to be nice and create comments in the code
  12. 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 的使用说明

函数 定义

</>复制代码

  1. // 函数定义
  2. ZEND_FUNCTION(laosiji_hello)
  3. {
  4. php_printf("hello laosiji!
  5. ");
  6. }
声明

</>复制代码

  1. ZEND_FUNCTION(laosiji_hello);
使用

</>复制代码

  1. // functions entry 函数模块
  2. static zend_function_entry laosiji_functions[] = {
  3. ZEND_FE(laosiji_hello, NULL) // 声明
  4. {NULL, NULL, NULL} // 固定不变的 照着写就行了
  5. };
  6. // module entry
  7. zend_module_entry laosiji_module_entry = {
  8. // ...
  9. laosiji_functions, /* Functions 载入函数模块*/
  10. // ...
  11. };
@函数别名

既然是别名就不存在定义声明咯 只要....就行了

</>复制代码

  1. static zend_function_entry laosiji_functions[] = {
  2. ZEND_FE(laosiji_hello, NULL) // 声明
  3. ZEND_NAMED_FE(laosiji_hi, ZEND_FN(laosiji_hello), NULL) // 函数别名 ZEND_NAMED_FE
  4. ZEND_FALIAS(laosiji_hehe, laosiji_hello, NULL) // 函数别名 ZEND_FALIAS
  5. {NULL, NULL, NULL} // 固定不变的 照着写就行了
  6. };
测试

</>复制代码

  1. 完整代码
  2. php_laosiji.h

  3. </>复制代码

    1. // 定义 扩展相关的宏 比如版本号 扩展名称等等。。
    2. #define PHP_LAOSIJI_EXTNAME "laosiji"
    3. #define PHP_LAOSIJI_VERSION "1.0.0"
    4. //加载config.h,如果配置了的话
    5. #ifdef HAVE_CONFIG_H
    6. #include "config.h"
    7. #endif
    8. // 加载php头文件
    9. // 这个 很有必要哈
    10. #include "php.h"
    11. // 多了个函数声明哈
    12. ZEND_FUNCTION(laosiji_hello);
  4. laosiji.c

  5. </>复制代码

    1. #include "php_laosiji.h"
    2. // functions entry 函数模块
    3. static zend_function_entry laosiji_functions[] = {
    4. ZEND_FE(laosiji_hello, NULL) // 声明
    5. ZEND_NAMED_FE(laosiji_hi, ZEND_FN(laosiji_hello), NULL) // 函数别名 ZEND_NAMED_FE
    6. ZEND_FALIAS(laosiji_hehe, laosiji_hello, NULL) // 函数别名 ZEND_FALIAS
    7. {NULL, NULL, NULL} // 固定不变的 照着写就行了
    8. };
    9. // module entry
    10. zend_module_entry laosiji_module_entry = {
    11. #if ZEND_MODULE_API_NO >= 20010901
    12. STANDARD_MODULE_HEADER,
    13. #endif
    14. PHP_LAOSIJI_EXTNAME, /* 扩展名称 */
    15. laosiji_functions, /* Functions 载入函数模块*/
    16. NULL, /* MINIT */
    17. NULL, /* MSHUTDOWN */
    18. NULL, /* RINIT */
    19. NULL, /* RSHUTDOWN */
    20. NULL, /* MINFO */
    21. #if ZEND_MODULE_API_NO >= 20010901
    22. PHP_LAOSIJI_VERSION, /* 扩展版本 */
    23. #endif
    24. STANDARD_MODULE_PROPERTIES};
    25. #ifdef COMPILE_DL_LAOSIJI
    26. ZEND_GET_MODULE(laosiji)
    27. #endif
    28. // 函数定义
    29. ZEND_FUNCTION(laosiji_hello)
    30. {
    31. php_printf("hello laosiji!
    32. ");
    33. }
  6. 参考
  7. 函数: https://github.com/imlaosiji/...
    函数别名: https://github.com/imlaosiji/...

  8. 结束
  9. 到目前看来这个司机进化了一点,算是有点本事(函数),也会隐藏自己(函数别名).
    不过还不够,参数?返回值?不急,休息下

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23044.html

相关文章

  • 面向对象基本原则(2)- 里式代换原则与依赖倒置原则

    摘要:四依赖倒置原则依赖倒置原则简介依赖倒置原则的英文名称是,简称。依赖倒置原则的表现其实就是面向接口编程。依赖倒置原则的优点减少类间的耦合性,提高系统的稳定性。结合里氏替换原则使用接口负责定义属性和方法,并且声明与其他对象的依赖关系。 面向对象基本原则(2)- 里式代换原则与依赖倒置原则 面向对象基本原则(1)- 单一职责原则与接口隔离原则面向对象基本原则(2)- 里式代换原则与依赖倒置原...

    liangdas 评论0 收藏0
  • PHP扩展开发系列01 - 我要成为一名司机

    摘要:找找出别人扩展真么写的。这次主要说了下写扩展要准备的一些基本知识。比如不同编译方式这个你看别的扩展源码的时候就会注意到具体作用。后面再来慢慢学习老司机的各种姿势。包括,函数,函数参数,函数返回值,对象,类,命名空间等等等。 PHP扩展开发系列01 - 我要成为一名老司机 1. 关于扩展的教程貌似挺全了,为啥还写? 记录下我写扩展的历程 自认为会写的更容易理解 我的宗旨就是 先用再识 ...

    30e8336b8229 评论0 收藏0
  • SegmentFault 技术周刊 Vol.40 - 2018,来学习一门新的编程语言吧!

    摘要:入门,第一个这是一门很新的语言,年前后正式公布,算起来是比较年轻的编程语言了,更重要的是它是面向程序员的函数式编程语言,它的代码运行在之上。它通过编辑类工具,带来了先进的编辑体验,增强了语言服务。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不觉已经到来了,总结过去的 2017,相信小伙们一定有很多收获...

    caspar 评论0 收藏0
  • SegmentFault 技术周刊 Vol.40 - 2018,来学习一门新的编程语言吧!

    摘要:入门,第一个这是一门很新的语言,年前后正式公布,算起来是比较年轻的编程语言了,更重要的是它是面向程序员的函数式编程语言,它的代码运行在之上。它通过编辑类工具,带来了先进的编辑体验,增强了语言服务。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不觉已经到来了,总结过去的 2017,相信小伙们一定有很多收获...

    nihao 评论0 收藏0
  • SegmentFault 技术周刊 Vol.40 - 2018,来学习一门新的编程语言吧!

    摘要:入门,第一个这是一门很新的语言,年前后正式公布,算起来是比较年轻的编程语言了,更重要的是它是面向程序员的函数式编程语言,它的代码运行在之上。它通过编辑类工具,带来了先进的编辑体验,增强了语言服务。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不觉已经到来了,总结过去的 2017,相信小伙们一定有很多收获...

    Drummor 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<