Latest News

Home » PHP程式設計教學 » 如何在延伸裡呼叫PHP函數

如何在延伸裡呼叫PHP函數

要如何在延伸裡呼叫PHP函數呢?在寫延伸的時候,肯定不能什麼功能都自己實現,原因有很多,開發效率、效能問題、維護成本等。

這就避免不了要在延伸裡呼叫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的參數及呼叫方法之後,我們來測試一下,究竟如何來使用。

About

發佈留言