我們來看看如何透過其實現類型綁定,但這個特性只能在Zend Engine 2也就是PHP5中使用。 讓我們再回顧一下ZE2's argument info結構。每一個arg info結構的宣告都是透過ZEND_BEGIN_ARG_INFO()或ZEND_BEGIN_ARG_INFO_EX()巨集函數開始的,然後緊跟著幾行ZEND_ARG_*INFO()巨集函數,最終以ZEND_END_ARG_INFO()巨集函數結束。如果我們想要重寫PHP語言中的count()函數,可以:
ZEND_FUNCTION(sample_count_array)
{
zval *arr;
if (zend_parse_parametsf.
{
RETURN_NULL();
}
RETURN_LONG(zend_hash_num_elements(Z_ARR_P(arr));Parrers RETURN_LONG(zend_hash_num_elements(Z_ARR_P(arr));但是如果我們透過zend_get_parameter()函數來接收參數的話就沒這麼幸運了,需要我們自己進行型別校對。如果想要讓核心自動完成類型校對,就需要arg_info上場了:
ZEND_BEGIN_ARG_INFO(php_sample_array_arginfo, 0)
....
PHP_FE(sample_count_array, php_sample_array_arginfo)
. ...
這樣我們便把類型校對的工作交給了Zend Engine,是不是有種如釋重負的感覺! You've also given your argument a name so that the generated error messages can be more meaningful to script writers attempting to use your API. 我們同樣可以對參數中的物件進行校驗,限制其是繼承自某個類別或實作了某個接口等等。
ZEND_BEGIN_ARG_INFO(php_sample_class_arginfo, 0)
ZEND_ARG_OBJ_INFO(1, obj, stdClass, 0)
ZEND_END_ARG_INFO()其實這個參數對物件來說幾乎沒用,因為ZE2中所有的物件在當作函數參數的時候都是預設以引用的形式傳遞的。但是我們又必須把這個參數設定為數字1,除非你不想讓你的擴充與PHP4相容。在PHP4中,物件是傳遞的一個完整Copy,而非透過引用。