首頁 >後端開發 >php教程 >編寫PHP擴充函數的參數類型綁定

編寫PHP擴充函數的參數類型綁定

巴扎黑
巴扎黑原創
2016-12-07 15:25:431542瀏覽

我們來看看如何透過其實現類型綁定,但這個特性只能在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,而非透過引用。 

對於陣列和物件參數,不要忘記最後的允許為NULL的參數。更多的資訊請參考第6章最後一節的有關敘述。  
透過arg info的方式來實現型別綁定的功能只對ZE2有效,也就是PHP5+。如果你想在PHP4上實現對應的功能,那需要用 zend_get_parameters()函數來接收參數,然後透過Z_TYPE_P()巨集函數來偵測參數的型別或透過convert_to_type()函數進行型別轉換。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn