Avant-propos
Cette fois, nous montrerons comment accepter les paramètres entrants et afficher les valeurs de retour dans les extensions 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"));
?>
Copier après la connexion
Nous implémenterons la méthode default_value
dans l'extension. [Recommandé : "Tutoriel PHP7"]default_value
方法。【推荐:《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, 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) {
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();
}
Copier après la connexion
代码说明
获取参数
在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.
更多格式化字符串的含义可以查看官方网站。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,分别是 ! 和 / 。! 对应宏方法的第二个参数。/ 对应宏方法的第三个参数。如果想开启,只要设置为1即可。
FAST ZPP相应的宏方法可以查看官方网站 https://wiki.php.net/rfc/fast_zpp#proposal
返回值
方法的返回值是使用RETURN_
Code
Implémenter la méthode default_value h2>
Méthode default_value
Code source de l'extension PHP :
rrreeeDescription du code
Obtention des paramètres
En PHP7, deux méthodes pour obtenir les paramètres sont fourni. zend_parse_parameters
et mode FAST ZPP.
zend_parse_parameters
Avant PHP7, la fonction zend_parse_parameters
était utilisée pour obtenir des paramètres. La fonction de cette fonction est de convertir les paramètres entrants dans les types correspondants dans le noyau PHP, afin qu'ils puissent être utilisés dans les extensions PHP.
Description du paramètre :
Le premier paramètre, le nombre de paramètres. En général, utilisez simplement ZEND_NUM_ARGS(), pas besoin de changer.
Le deuxième paramètre est la chaîne de format. La fonction de cette chaîne de format est de spécifier la relation de conversion entre les paramètres entrants et le type de noyau PHP.
La signification de S|z dans le code est : S signifie que le paramètre est une chaîne. Convertissez les paramètres entrants en type zend_string.
| signifie que les paramètres suivants sont facultatifs. Cela peut être transmis ou non. 🎜z indique que les paramètres sont de plusieurs types. Convertissez les paramètres entrants en type zval. 🎜🎜De plus, certains prescripteurs nécessitent une attention particulière : 🎜 ! Si une variable null en langage PHP est reçue, elle est directement convertie en NULL en langage C au lieu de l'encapsuler dans un zval de type IS_NULL. 🎜/ Si la variable transmise partage un zval avec d'autres variables et n'est pas une référence, une séparation forcée est effectuée. Le nouveau zval is_ref__gc==0 et refcount__gc==1.🎜🎜Plus de significations des chaînes formatées peuvent être consultées. site web. https://wiki.php.net/rfc/fast_zpp🎜
🎜Nouvelle méthode fournie en PHP7. Il s’agit d’améliorer les performances de l’analyse des paramètres. Pour les méthodes fréquemment utilisées, il est recommandé d'utiliser la méthode FAST ZPP. 🎜Comment utiliser : 🎜Commencez avec ZEND_PARSE_PARAMETERS_START(1, 2). 🎜Le premier paramètre indique le nombre de paramètres qui doivent être transmis et le deuxième paramètre indique le nombre maximum de paramètres pouvant être transmis. 🎜Terminez par
. 🎜Le milieu est l'analyse des paramètres entrants. 🎜Il est à noter que généralement la méthode macro de FAST ZPP correspond au spécificateur de
un-à-un. Par exemple : 🎜Z_PARAM_OPTIONAL correspond à |🎜Z_PARAM_STR correspond à S🎜Cependant, la méthode Z_PARAM_ZVAL_EX est particulière. Il correspond à deux spécificateurs, à savoir ! et /. ! Correspond au deuxième paramètre de la méthode macro. / correspond au troisième paramètre de la méthode macro. Si vous souhaitez l'activer, réglez-le simplement sur 1. 🎜🎜La méthode macro correspondante de FAST ZPP peut être consultée sur le site officiel https://wiki.php.net/rfc/fast_zpp#proposal🎜
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!