PHP擴展開發系列02 - 老司機起步之函數

上一篇擴展開發引導文章中。建立了編寫擴展的三個基本文件。或許你會有個疑問
PHP沒有相似的自動生成項目框架的工具嗎? 固然有。
這篇文章就開始介紹使用 "php-ext-cli" 工具來生成擴展項目文件
注意這裏的 "php-ext-cli" 自己沒有這玩意,是我給 PHP 自帶的起的別名
這個工具就是 php-src/ext/ext_skel
還有點迷惑? 那不廢話了。
順便給那個只會裝逼的司機加個功能(函數吧)php

下載(領車)

我用的是 php 5.6.30版本
不要糾結版本,固然也先別直接用 php7.x 版本git

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

  2. http://php.net/downloads.phpphp7

解壓(開門)

tar zxf php-5.6.30.tar.gz 框架

進入ext(上車)

cd php-src/ext/svn

ext目錄中內容

目錄內不少文件夾和文件 (車內豪華裝飾)
須要關心的暫時有:函數

  1. ext_skel工具

  2. 其餘擴展的文件夾測試

其餘的先無論咯。spa

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 什麼事了。至於其餘參數 自行了解。

圖片描述

發現也是有這三個文件的。至於文件裏面的內容呢。那確定跟上次本身寫的文件內容不一樣。否則我豈不是神?
說明下,對比下咱們本身寫的三個文件 與 自動生成的。

  1. 不應少的沒少

  2. 多的先無論

  3. 關鍵地方不一樣的沒事

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

  5. 咱們本身寫的也能生成擴展,也能生效。

  6. 因此,不要質疑本身。

後面的項目結構以本身寫的爲主,也就是說不會用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}                                      // 固定不變的 照着寫就好了
};

測試

<?php
@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");
}

參考

函數: https://github.com/imlaosiji/...
函數別名: https://github.com/imlaosiji/...

結束

到目前看來這個司機進化了一點,算是有點本事(函數),也會隱藏本身(函數別名).不過還不夠,參數?返回值?不急,休息下

相關文章
相關標籤/搜索