2010-09-01 204 views
3

內調用PHP_FUNCTION讓我詳細說明標題。考慮例如PHP_FUNCTION(session_start)。我能否從另一個PHP_FUNCTION的session_id中調用session_start(這僅僅是爲了說明而不是實際目的)?是否可以從擴展

+3

我不知道其他人,但我不明白你想要什麼朋友:( – Iznogood 2010-09-01 03:08:45

回答

6

嗯,是的,但你應該儘可能避免它。編寫函數內部實現的主要好處之一是,與PHP中發生的情況相反,C函數調用很便宜。另外,用C代碼在內部調用PHP函數是相當痛苦的。

例如,在session_start的情況下,您有php_session_start,它由會話擴展顯示。由於我在第一段中描述的內容,擴展通常會導出可能對其他人有用的C函數。

事實上,調用內部PHP函數bar,最好的策略,需要內部PHP函數foo如果可能的話,將是確定的輔助(非PHP_FUNCTION)C與大多數的bar的功能實現。然後PHP_FUNCTION(foo)PHP_FUNCTION(bar)都可以調用該輔助功能。

不管怎樣,調用PHP函數的最簡單的方法是使用call_user_function

int call_user_function(HashTable *function_table, zval **object_pp, 
    zval *function_name, zval *retval_ptr, zend_uint param_count, 
    zval *params[] TSRMLS_DC); 

的變體call_user_function_ex還允許禁止分離時的參數應該參照由它來發送不是和指定符號表。

如果相關功能是內部功能(PHP_FUNCTION)或在用戶空間中定義,則這兩種功能都可以使用。如果它是一個常規函數,則應該使用EG(function_table)作爲第一個參數,第二個參數應該爲NULL,我認爲您可以找出其他參數。

如果您多次執行此功能,這不是非常有效。在這種情況下,請參閱"Zend_API.h"中以zend_fcall_開頭的功能。

我不會推薦其他選項來調用內部函數,例如手動設置參數堆棧和其他技巧,以及他們手動調用底層C函數。

0

即。 session_start(session_id())

是的,但是在這種情況下它沒有意義,因爲session_id()要求會話已經啓動。