日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

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

發布時間:2023/12/20 php 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 什么事了。至于其他參數 自行了解。

發現也是有這三個文件的。至于文件里面的內容呢。那肯定跟上次自己寫的文件內容不同。不然我豈不是神?

說明下,對比下我們自己寫的三個文件 與 自動生成的。

不該少的沒少

多的先不管

關鍵地方不同的沒事

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

我們自己寫的也能生成擴展,也能生效。

所以,不要質疑自己。

后面的項目結構以自己寫的為主,也就是說不會用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");

}

參考

結束

到目前看來這個司機進化了一點,算是有點本事(函數),也會隱藏自己(函數別名).

不過還不夠,參數?返回值?不急,休息下

總結

以上是生活随笔為你收集整理的php7 有ext skel吗,PHP扩展开发系列02 - 老司机起步之函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。