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 - 老司机起步之函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 梁代码,方舟生存进化梁龙鞍
- 下一篇: C++远航之封装篇——类外定义和::