宣告:本文為斯人原創,全部為作者一一分析得之,有不對的地方望賜教。
在寫擴充套件的時候,
肯定不能什麼功能都自己實現,原因有很多,開發效率、效能問題、維護成本等。
這就避免不了要在擴充套件裡呼叫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編譯器編譯函式時不帶引...