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");

}

参考

结束

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 数据类型转换与比较

<?php define("PI", 3.1415926); echo PI."<br>"; //定义一个常量 define("GREETING","Hello world!");echo constant("GREETING")."<br>"; $a 10; $b "10a"; echo (string)$a $b; …

(转载)说说char

char一直都在使用并且大量的使用&#xff0c;但是&#xff0c;大部分都是在单一平台上&#xff0c;那样没有太多的问题&#xff0c;在windows上大量直接使用wchar_t来解决中文的问题。并且在使用跨平台时也大多直接使用了Qt的QString来节省了很多的麻烦&#xff0c;但是现在项目…

字符串类型、结构体、共用体、枚举、container宏、内存来源

一、C语言的字符串类型 1、C语言没有原生字符串类型 很多高级语言像java、C#等就有字符串类型&#xff0c;有个String来表示字符串&#xff0c;用法和int这些很像&#xff0c;可以String s1 "linux";来定义字符串类型的变量。C语言没有String类型&#xff0c;C语言…

WPF 正確理解ContentPresenter

2019独角兽企业重金招聘Python工程师标准>>> 我們先由下圖來看類層次,可知ContentControl繼承Control,ContentPresenter繼承FrameworkElement(Control也繼承FrameworkElement); 同樣的,ItemsControl繼承Control,ItemsPresenter繼承FrameworkElement. 在Control類並…

java 数据网格,easyui数据网格

easyui中的数据网格应用1.页面代码&#xff1a;class"java" name"code">String path request.getContextPath();String basePath request.getScheme()"://"request.getServerName()":"request.getServerPort()path"/";…

存储类、作用域、生命周期、链接属性

以下内容源于朱有鹏嵌入式课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 补充&#xff1a;https://blog.csdn.net/oqqHuTu12345678/article/details/71214255 一、概念集合 1、存储类 &#xff08;1&#xff09;存储类就是存储类型&#xff0c;也就是描述C语言变…

java动态交叉表,SqlServer如何生成动态交叉表查询

为了说明问题&#xff0c;我们用SqlServer自带的事例数据库(Northwind)来进行验证&#xff0c;所有的例子请放到Northwind中运行&#xff0c;我可能会省略Use语句&#xff0c;所引用的表&#xff0c;都是Northwind中的&#xff0c;下面我就不再说明了这里指的交叉表&#xff0c…

Canvas Clock

这两天在看html5的canvas,实现了上面那个东西 需要注意的地方&#xff1a; 1.canvas的sava()和restore()理解和使用 2.canvas的translate scale rotate ..的使用&#xff0c;每个变化都应该清楚圆心和角度..看&#xff1a;http://blog.sina.com.cn/s/blog_8fab526c01015tqs.htm…

CentOS 6.3 下用ntfs-3g挂载Windows NTFS分区

2019独角兽企业重金招聘Python工程师标准>>> 默认情况下&#xff0c;CentOS 6.3不支持Widows NTFS硬盘分区读写&#xff0c;要想把NTFS格式的磁盘挂载到CentOS 6.3下面需要安装第三方的插件ntfs-3g&#xff0c;这里我们采用编译安装插件。 1、安装编译器&#xff0c…

宏定义与预处理、函数和函数库

以下内容源于朱有鹏嵌入式课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 一、C语言预处理理论 1、由源码到可执行程序的过程 源码.c->(编译)->elf可执行程序源码.c->(编译)->目标文件.o->(链接)->elf可执行程序源码.c->(编译)->汇编文件.S…

PictureBox

代码添加图片&#xff1a; pictureBox1.Image Image.FromFile("F:\360wallpaper_dt.jpg"); http://msdn.microsoft.com/query/dev10.query?appIdDev10IDEF1&lZH-CN&kk(SYSTEM.WINDOWS.FORMS.PICTUREBOX);k(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERS…

C++的const修饰

2019独角兽企业重金招聘Python工程师标准>>> C的const修饰 ‍const的两个用途‍ &#xff08;1&#xff09;可以定义 const 常量 &#xff08;2&#xff09;const 可以修饰函数的参数、返回值. const的好处 &#xff08;1&#xff09;便于进行类型检查&#xff0c;…

链表(单链表、双链表、内核链表)

以下内容源于朱有鹏嵌入式课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 一、链表的引入 1、从数组的缺陷说起 数组有2个缺陷&#xff0c;一个是数组中所有元素的类型必须一致&#xff1b;第二个是数组的元素个数必须事先制定并且一旦指定之后不能更改。数组的第一…

心率变异性 matlab,心率变异性好的功率谱分析方面的问题

本帖最后由 天路 于 2018-2-25 21:16 编辑本人正在学习心率变异性方面的内容&#xff0c;但是按照文献上的方法做出来的结果并不是很理想&#xff0c;文献上说的是心率变异性的频率的范围是0.4以内&#xff0c;但是我做的功率谱上显示频率分布在整个频域内&#xff0c;试了很多…

C#获取Windows下光标位置(转)

使用C#获取光标相对于显示器屏幕的位置&#xff1a; 方式一&#xff1a; 1 [csharp] view plaincopyprint?2 using System; 3 using System.Drawing; 4 using System.Runtime.InteropServices; 5 6 namespace ColorPicker 7 { 8 /// <summary> 9 /// win…

[Android Studio] Android Studio如何提示函数用法

Eclipse有一个很好的功能&#xff0c;就是当你代码调用某个android API时&#xff0c;鼠标移到对应的函数或者方法上&#xff0c;就会自动有一个悬 浮窗提示该函数的说明&#xff08;所包含的参数含义&#xff0c;该方法功能&#xff09;。迁移到Android Studio后&#xff0c;这…

uboot源码——链接脚本u-boot.lds分析

以下内容源于朱有鹏嵌入式的学习与整理&#xff0c;如有侵权&#xff0c;请告知删除。 uboot的链接脚本u-boot.lds&#xff0c;位于uboot根目录下的/board/samsung/x210目录。 脚本内容与分析如下&#xff1a; /** (C) Copyright 2002* Gary Jennejohn, DENX Software Engi…

php 调用 com,PHP调用COM函数

用PHP调用windows中的COM相关函数&#xff1a;函数列表&#xff1a;com_load — 创建一个COM组件的引用。com_invoke — 调用一个COM组件的方法。com_propget — 取一个COM组件的属性的值。com_get — 同上&#xff0c;取一个COM组件的属性的值。com_propput — 赋一个值给一个…

struts2--java.lang.IllegalAccessException: Class ognl.OgnlRuntime can not access a member of

这个问题是我碰到的一个比较纠结的问题&#xff0c;如果第一次碰到肯定能让你也很纠结&#xff0c;哈哈 [c-sharp] view plaincopyprint? 01.2010-10-19 18:27:22 com.opensymphony.xwork2.util.logging.jdk.JdkLogger warn 02.警告: Error setting expression nnew.nTitle …

情怀真的可以吃~致文青

说实在的&#xff0c;这首歌名如其实的平凡。最标准的Trip-Hop节奏&#xff0c;最普通的四个和弦&#xff0c;最没有惊喜的合成器音色&#xff0c;歌词也是那山那山的波澜不惊。就是这么一首平平无奇的歌&#xff0c;却在首发的7个小时内&#xff0c;狂刷一百万次试听点击。 …