這次,我們將演示如何在php擴充套件中接受傳入的引數和輸出返回值。
<?php
function default_value ($type, $value = null) else if ($type == "bool") else if ($type == "str")
return null;
}var_dump(default_value("int"));
var_dump(default_value("int", 1));
var_dump(default_value("bool"));
var_dump(default_value("bool", true));
var_dump(default_value("str"));
var_dump(default_value("str", "a"));
var_dump(default_value("array"));
?>
我們將在擴充套件中實現default_value
方法。
default_value方法的php擴充套件原始碼:
php_function(default_value)
#else
zend_parse_parameters_start(1, 2)
z_param_str(type)
z_param_optional
z_param_zval_ex(value, 0, 1)
zend_parse_parameters_end();
#endif
if (zstr_len(type) == 3 && strncmp(zstr_val(type), "int", 3) == 0 && value == null) else if (zstr_len(type) == 3 && strncmp(zstr_val(type), "int", 3) == 0 && value != null) else if (zstr_len(type) == 4 && strncmp(zstr_val(type), "bool", 4) == 0 && value == null) else if (zstr_len(type) == 4 && strncmp(zstr_val(type), "bool", 4) == 0 && value != null) else if (zstr_len(type) == 3 && strncmp(zstr_val(type), "str", 3) == 0 && value == null) else if (zstr_len(type) == 3 && strncmp(zstr_val(type), "str", 3) == 0 && value != null)
return_null();
}
在php7中提供了兩種獲取引數的方法。zend_parse_parameters
和fast zpp方式。
zend_parse_parameters
在php7之前一直使用zend_parse_parameters
函式獲取引數。這個函式的作用,就是把傳入的引數轉換為php核心中相應的型別,方便在php擴充套件中使用。
引數說明:
第乙個引數,引數個數。一般就使用zend_num_args()
,不需要改變。
第二個引數,格式化字串。這個格式化字串的作用就是,指定傳入引數與php核心型別的轉換關係。
**中 s|z 的含義就是:
s 表示引數是乙個字串。要把傳入的引數轉換為zend_string型別。
| 表示之後的引數是可選。可以傳,也可以不傳。
z 表示引數是多種型別。要把傳入的引數轉換為zval型別。
除此之外,還有一些specifier,需要注意:
!如果接收了乙個php語言裡的null變數,則直接把其轉成c語言裡的null,而不是封裝成is_null型別的zval。
/ 如果傳遞過來的變數與別的變數共用乙個zval,而且不是引用,則進行強制分離,新的zval的is_ref__gc==0, and refcount__gc==1.
更多格式化字串的含義可以檢視官方**。
fast zpp
在php7中新提供的方式。是為了提高引數解析的效能。對應經常使用的方法,建議使用fast zpp方式。
使用方式:
以zend_parse_parameters_start(1, 2)
開頭。
第乙個引數表示必傳的引數個數,第二個引數表示最多傳入的引數個數。
以zend_parse_parameters_end();
結束。
中間是傳入引數的解析。
值得注意的是,一般fast zpp的巨集方法與zend_parse_parameters的specifier是一一對應的。如:
z_param_optional 對應 |
z_param_str 對應 s
但是,z_param_zval_ex方法比較特殊。它對應兩個specifier,分別是 ! 和 / 。! 對應巨集方法的第二個引數。/ 對應巨集方法的第三個引數。如果想開啟,只要設定為1即可。
fast zpp相應的巨集方法可以檢視官方** #proposal
方法的返回值是使用return_
開頭的巨集方法進行返回的。常用的巨集方法有:
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
更多函式說明請檢視
PHP7擴充套件開發之hello word
原文出處 本文是以php7作為基礎,講解如何從零開始建立乙個php擴充套件。本文主要講解建立乙個擴充套件的基本步驟都有哪些。示例中,我們將實現如下功能 echo say 輸出內容 php test.php hello word 在擴充套件中實現乙個say方法,呼叫say方法後,輸出 hello wo...
PHP7擴充套件開發之hello word
echo say 輸出內容 php test.php hello word在擴充套件中實現乙個say方法,呼叫say方法後,輸出 hello word。php為我們提供了生成基本 的工具 ext skel。這個工具在php源 的.ext目錄下。cd php src ext ext skel extn...
PHP7擴充套件開發之hello word
本文是以php7作為基礎,講解如何從零開始建立乙個php擴充套件。本文主要講解建立乙個擴充套件的基本步驟都有哪些。示例中,我們將實現如下功能 echo say 輸出內容 php test.php hello word在擴充套件中實現乙個say方法,呼叫say方法後,輸出 hello word。php...