如何在擴充套件裡呼叫PHP函式呢

2021-06-07 05:50:39 字數 2203 閱讀 1976

宣告:本文為斯人原創,全部為作者一一分析得之,有不對的地方望賜教。

在寫擴充套件的時候,

肯定不能什麼功能都自己實現,原因有很多,開發效率、效能問題、維護成本等。

這就避免不了要在擴充套件裡呼叫php核心函式。

那麼如何在擴充套件裡面使用我們的內建函式呢?

php既然有函式,肯定提供了呼叫函式的介面,

這裡有兩個函式:

zend_api int call_user_function(hashtable *function_table, zval **object_pp, zval *function_name, zval *retval_ptr, zend_uint param_count, zval *params tsrmls_dc);

zend_api int call_user_function_ex(hashtable *function_table, zval **object_pp, zval *function_name, zval **retval_ptr_ptr, zend_uint param_count, zval **params, int no_separation, hashtable *symbol_table tsrmls_dc);

很可惜,只找到宣告的地方,沒有找到注釋的地方,

從宣告來看,call_user_function 封裝了call_user_function_ex,

少了兩個傳參:

int no_separation:這個的用意就是是否對zval進行分離,不過此功能現在已經不用了,如果設為1則直接會出錯,分離的作用是為了優化空間。

symbol_table :是幹嗎用的,確實目前還不知道。

hashtable* function_table: 函式表,我們都知道 使用者函式也好,其他內建函式也好都會存在hashtable裡面,function_table會儲存所有內建函式和使用者函式,用cg來獲取,因為函式表屬於是 編譯全域性變數。

zval **object_pp:這個是用來我們呼叫類裡的某個方法的物件,看到這裡,你恍然大悟沒有,呼叫普通函式和呼叫類的方法是同乙個,

function_table和object_pp只需要乙個就可以了。

zval **retval_ptr_ptr:是函式的返回值。

zend_uint param_count:函式/方法 的引數個數

zval **params :函式/方法的引數指標。

那麼清楚了兩個api的引數及呼叫方法之後,我們來測試一下,究竟如何來使用。

首先 建立乙個 擴充套件檔案

/ext/ext_skel –extname=call_func

修改config.m4

在php_call_func.h中新增

php_function(siren_call);做乙個宣告

開啟call_func.c

重點**:

php_function(siren_call)

if(function_name->type!=is_string)

//call_user_function(``,`< zval **object_pp>`,`< zval *function_name>`,`< zval *retval_ptr>`,`< zend_uint param_count>`,`< zval *params tsrmls_dc>`)

zval**params=(zval**)malloc(sizeof(zval));

params[0]=args;

if(call_user_function(cg(function_table),null,function_name,retval,1,params tsrmls_dc)==failure)

*return_value=*retval;

zval_copy_ctor(return_value);

zval_ptr_dtor(&retval);

}

這樣,我們編譯之後,就建好了乙個擴充套件,

siren_call接收兩個引數,第乙個是需要呼叫的函式名,第二個是傳給函式的引數。這裡只是乙個簡單的zval型別

使用方法如下

function test($a)

siren_call("test"," siren!\r\n");

這樣 就會輸出 my name is siren;

怎麼樣 是不是很簡單。

原文出處:

如何在Xcode裡鎖定檔案不讓別人編輯呢

我們在用xcode程式設計時,不小心修改了系統庫檔案時總是會彈出如下圖的lock框,這樣能防止誤修改。假如我們自己寫個東西給別人用,但是不想讓別人編輯,也想要彈出這個鎖定框lock住檔案,該如何做呢?其實也很簡單,這個檔案的屬性設定為readonly,在xcode裡就會彈出這個鎖定框了。我們檢視下這...

C 如何在普通類裡呼叫窗體控制項

一種是建立窗體物件的方式,通過物件呼叫控制項或方法 例如 form1 form1 new form1 form1.button 呼叫控制項 form1.method 呼叫方法當然了,控制項的modifiers屬性要設定成public 另一種是不建立窗體物件 在form1類下定義靜態變數,構造方法中引...

如何在C 中呼叫C函式

這是程式設計師面試寶典中的一道題,查資料得到解決方法 注意這裡的c呼叫c 或者c 呼叫c意思是.c檔案中呼叫.cpp檔案中 或者相反。整合開發環境如vc 6.0或者vs都是以檔案字尾來區別當前要編譯的是c 還是 然後採用響應的編譯 呼叫協議等。使用extern c 主要是因為c編譯器編譯函式時不帶引...