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