媒介
此次,咱们将演示假定正在php扩大外接管传进的参数以及输入返归值。
<必修php function default_value ($type, $value = null) {
if ($type == "int") {
return $value 必修必修 0;
} else if ($type == "bool") {
return $value 必修选修 false;
} else if ($type == "str") {
return is_null($value) 选修 "" : $value;
}
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办法。【保举:《php7/" target="_blank">PHP7学程》】
代码
完成default_value办法
default_value办法的PHP扩大源码:
PHP_FUNCTION(default_value)
{
zend_string *type;
zval *value = NULL;
#ifndef FAST_ZPP
/* Get function parameters and do error-checking. */
if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|z", &type, &value) == FAILURE) {
return;
}
#else
ZEND_PARSE_PARAMETERS_START(1, 两)
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) {
RETURN_LONG(0);
} else if (ZSTR_LEN(type) == 3 && strncmp(ZSTR_VAL(type), "int", 3) == 0 && value != NULL) {
RETURN_ZVAL(value, 0, 1);
} else if (ZSTR_LEN(type) == 4 && strncmp(ZSTR_VAL(type), "bool", 4) == 0 && value == NULL) {
RETURN_FALSE;
} else if (ZSTR_LEN(type) == 4 && strncmp(ZSTR_VAL(type), "bool", 4) == 0 && value != NULL) {
RETURN_ZVAL(value, 0, 1);
} else if (ZSTR_LEN(type) == 3 && strncmp(ZSTR_VAL(type), "str", 3) == 0 && value == NULL) {
RETURN_EMPTY_STRING();
} else if (ZSTR_LEN(type) == 3 && strncmp(ZSTR_VAL(type), "str", 3) == 0 && value != NULL) {
RETURN_ZVAL(value, 0, 1);
}
RETURN_NULL();
}代码分析
猎取参数
正在PHP7外供给了二种猎取参数的办法。zend_parse_parameters以及FAST ZPP体式格局。
zend_parse_parameters
正在PHP7以前始终运用zend_parse_parameters函数猎取参数。那个函数的做用,即是把传进的参数转换为PHP内核外呼应的范例,未便正在PHP扩大外利用。
参数阐明:
第一个参数,参数个数。个别便利用ZEND_NUM_ARGS(),没有必要旋转。
第2个参数,格局化字符串。那个款式化字符串的做用即是,指定传进参数取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.
更多款式化字符串的寄义否以查望民间网站。https://wiki.php.net/rfc/fast_zpp
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,分袂是 ! 以及 / 。! 对于应宏法子的第2个参数。/ 对于应宏办法的第三个参数。若是念封闭,只需设施为1便可。
FAST ZPP响应的宏法子否以查望民间网站 https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/php/z1wzx1ngmms>
返归值
办法的返归值是应用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扩大开辟之传参加返归值的具体形式,更多请存眷萤水红IT仄台其余相闭文章!

发表评论 取消回复