天天看點

PHP7擴充開發之傳參與傳回值前言

這次,我們将示範如何在php擴充中接受傳入的參數和輸出傳回值。

我們将在擴充中實作<code>default_value</code>方法。

str_concat方法的php擴充源碼:

在php7中提供了兩種擷取參數的方法。<code>zend_parse_parameters</code>和fast zpp方式。

在php7之前一直使用<code>zend_parse_parameters</code>函數擷取參數。這個函數的作用,就是把傳入的參數轉換為php核心中相應的類型,友善在php擴充中使用。

參數說明:

第一個參數,參數個數。一般就使用<code>zend_num_args()</code>,不需要改變。

第二個參數,格式化字元串。這個格式化字元串的作用就是,指定傳入參數與php核心類型的轉換關系。

代碼中 s|z 的含義就是:

除此之外,還有一些specifier,需要注意:

在php7中新提供的方式。是為了提高參數解析的性能。對應經常使用的方法,建議使用fast zpp方式。

使用方式:

以<code>zend_parse_parameters_start(1, 2)</code>開頭。

第一個參數表示必傳的參數格式,第二個參數表示最多傳入的參數個數。

以<code>zend_parse_parameters_end();</code>結束。

中間是傳入參數的解析。

值得注意的是,一般fast zpp的宏方法與zend_parse_parameters的specifier是一一對應的。如:

z_param_optional 對應 |

z_param_str 對應 s

但是,z_param_zval_ex方法比較特殊。它對應兩個specifier,分别是 ! 和 / 。! 對應宏方法的第二個參數。/ 對應宏方法的第三個參數。如果想開啟,隻要設定為1即可。

方法的傳回值是使用<code>return_</code>開頭的宏方法進行傳回的。常用的宏方法有:

return_null() 傳回null

return_long(l) 傳回整型

return_double(d) 傳回浮點型

return_str(s) 傳回一個字元串。參數是一個zend_string * 指針

return_string(s) 傳回一個字元串。參數是一個char * 指針

return_stringl(s, l) 傳回一個字元串。第二個參數是字元串長度。

return_empty_string() 傳回一個空字元串。

return_arr(r) 傳回一個數組。參數是zend_array *指針。

return_obj(r) 傳回一個對象。參數是zend_object *指針。

return_zval(zv, copy, dtor) 傳回任意類型。參數是 zval *指針。

return_false 傳回false

return_true 傳回true

更多宏方法請檢視 zend/zend_api.h中的相關代碼。

<a href="http://www.bo56.com/php7%e6%ba%90%e7%a0%81%e9%98%85%e8%af%bb%e7%ac%94%e8%ae%b0%ef%bc%88%e4%b8%8d%e6%96%ad%e6%9b%b4%e6%96%b0%ef%bc%89/">更多函數說明請檢視</a>

<a href="http://www.bo56.com/download/php7_ext/say_default_value.tar.gz">tar.gz格式下載下傳</a>

<a href="http://www.bo56.com/download/php7_ext/say_default_value.zip">zip格式下載下傳</a>