內調用PHP_FUNCTION讓我詳細說明標題。考慮例如PHP_FUNCTION(session_start)。我能否從另一個PHP_FUNCTION的session_id中調用session_start(這僅僅是爲了說明而不是實際目的)?是否可以從擴展
Q
是否可以從擴展
3
A
回答
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()
要求會話已經啓動。
相關問題
- 1. 是否可以擴展DefaultValueAccessor?
- 2. 是否可以擴展DataColumn.Expression
- 3. 是否可以擴展類
- 4. 是否可以從Twig_Lexer擴展?
- 5. 是否可以擴展xaml setter?
- 6. 是否可以擴展Intellitrace事件?
- 7. 是否可以在Android中擴展Canvas?
- 8. 是否可以「隱藏」語言擴展?
- 9. 託管bean是否可以擴展DTO
- 10. 是否可以擴展私人功能?
- 11. Laravel 4 - 是否可以擴展DB類?
- 12. 是否可以擴展布局?
- 13. 是否可以擴展Java Enums?
- 14. 是否可以擴展混音?
- 15. 是否可以「擴展」財產「類」?
- 16. 是否可以擴展標準UI
- 17. 是否可以擴展快速申請
- 18. 是否可以擴展EventTarget接口?
- 19. 是否可以擴展現有的TypeConverter?
- 20. 是否可以「擴展」或重新使用Eclipse擴展點?
- 21. 是否可以使用擴展方法擴展泛型類?
- 22. 是否可以將Jetpack擴展轉換爲chrome擴展?
- 23. silverlight是否可擴展?
- 24. 是否可以從插件擴展Wordpress XMLRPC接口?
- 25. 是否可以從網站發起擴展?
- 26. 是否可以從Python中的內置函數類擴展?
- 27. C++的value_type是否可以從iterator_traits擴展到所有類型?
- 28. 是否可以從ODOO中的擴展類繼承?
- 29. 是否可以從chrome擴展中訪問COM對象?
- 30. 是否可以從vscode擴展內部驗證OAuth 2.0 API
我不知道其他人,但我不明白你想要什麼朋友:( – Iznogood 2010-09-01 03:08:45