首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

撰寫自己的 PHP 擴展函數 (一):從 ext_skel 到 Hello World

     編輯:PHP 相關知識

前言

PHP 內建功能雖多,但有時需要自訂 C 層擴展以提升效能或整合外部庫。本文示範使用 PHP 原始碼附帶的 ext_skel 工具建立擴展骨架,並實作第一個函數 say_hello()。

環境與工具

  • PHP 原始碼包 (示範 4.0.5,新版類似)
  • ext_skel 位於 ext/ 目錄

建立擴展骨架

cd php-4.0.5/ext
./ext_skel --extname=my_module

產生目錄 my_module/ 含設定檔、原始碼、測試腳本。

修改設定檔 config.m4

啟用 PHP_ARG_ENABLE 區塊 (移除 dnl 註解):

PHP_ARG_ENABLE(my_module, whether to enable my_module support,
[  --enable-my_module   Enable my_module support])

實作 say_hello() 函數

my_module.c:

/* 函數表註冊 */
function_entry my_module_functions[] = {
    PHP_FE(say_hello, NULL)
    PHP_FE(confirm_my_module_compiled, NULL)
    {NULL, NULL, NULL}
};

/* 函數實作 */
PHP_FUNCTION(say_hello) {
    zend_printf("hello world ");
}

php_my_module.h:

PHP_FUNCTION(say_hello);

編譯與測試

cd php-4.0.5
./buildconf
./configure --enable-my_module
make
# 測試
sapi/cli/php -r 'say_hello();'  # 輸出: hello world

進階:帶參數的函數

修改 say_hello 接受字串參數:

PHP_FUNCTION(say_hello) {
    zval **name;
    if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &name) == FAILURE) {
        WRONG_PARAM_COUNT;
    }
    zend_printf("hello world, %s ", Z_STRVAL_PP(name));
}

重新 make,測試:

sapi/cli/php -r 'say_hello("Yorgo");'  # 輸出: hello world, Yorgo

關鍵 API 說明

  • zval:PHP 內部變數結構
  • ZEND_NUM_ARGS():取得實際傳入參數個數
  • zend_get_parameters_ex():取得參數指標
  • Z_STRVAL_PP():取得字串值
  • WRONG_PARAM_COUNT:拋出參數錯誤

(待續:下篇將介紹更複雜的擴展開發)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved