我正在開發一個PHP擴展,使用C.到目前爲止,我正在對參數進行適當的驗證,並從PHP用戶空間傳遞給擴展的函數。如何讓ZEND_BEGIN_ARG_INFO_EX控制傳遞給PHP擴展的參數個數?
宏ZEND_BEGIN_ARG_INFO_EX
可用於爲Zend引擎提供有關函數參數的信息。該宏的第四個參數(名爲required_num_args
)讓引擎自動控制參數的數量,從而消除了這種麻煩。但是,我找不到使其工作的方式:即使PHP腳本沒有傳遞足夠的參數,引擎也會始終運行擴展的功能,而不會發出任何警告。
這裏是我的函數參數的定義:
ZEND_BEGIN_ARG_INFO_EX(test_func_swt_arginfo, 0, 0, 3)
ZEND_ARG_INFO(1, firstArg)
ZEND_ARG_ARRAY_INFO(0, secondArg, true)
ZEND_ARG_OBJ_INFO(1, thirdArg, SomeClass, false)
ZEND_END_ARG_INFO()
這裏是我的功能定義,由PHP擴展出口:
static const zend_function_entry test_func_functions[] = {
PHP_FE(sample_with_types, test_func_swt_arginfo)
PHP_FE_END
};
這裏是我的功能:
PHP_FUNCTION(sample_with_types)
{
RETURN_TRUE;
}
這是我運行的PHP腳本:
<?php
sample_with_types();
預期結果:PHP顯示錯誤/警告/異常,如「沒有足夠的參數傳遞給函數」;該功能不會執行。
實際結果:函數執行並返回true
。
如何正確配置函數參數結構,以便Zend引擎自動檢查參數的數量?或者我在ZEND_BEGIN_ARG_INFO_EX
宏中誤將required_num_args
參數的目的?
感謝@netcoder的信息和努力,澄清該宏的目的。它非常有意義,事實上我在問這個問題之前已經發現了它。然而,主要的是,這引起了我的困惑,並讓我走向SO,它是'required_num_args'參數。它看起來像args num的自動驗證,但實際上它什麼都不做。難道是,你知道它的目的? –
@AndreyTserkus:'required_num_args'用於反射並表示何時根據需要停止計數參數(即:調用'isOptional()'時)。除此之外,它沒有任何效果。 (我用這個信息更新了答案。) – netcoder
太棒了,謝謝! –