Maison  >  Article  >  développement back-end  >  Exemples pour expliquer la valeur de retour du développement de l'extension PHP7

Exemples pour expliquer la valeur de retour du développement de l'extension PHP7

藏色散人
藏色散人avant
2021-10-15 16:32:332796parcourir

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"));
?>

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();
}

代码说明

获取参数

在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 :
rrreee

Description 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🎜

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 ZEND_PARSE_PARAMETERS_END();. 🎜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 zend_parse_parameters 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🎜

Valeur de retour

🎜La valeur de retour de la méthode est de utilisez RETURN_ La méthode macro commençant par code> renvoie. Les méthodes de macro couramment utilisées sont : 🎜RETURN_NULL() Renvoie null🎜RETURN_LONG(l) Renvoie le type entier🎜RETURN_DOUBLE(d) Renvoie le type à virgule flottante🎜RETURN_STR(s) Renvoie une chaîne. Le paramètre est un pointeur zend_string * 🎜RETURN_STRING(s) Renvoie une chaîne. Le paramètre est un pointeur char * 🎜RETURN_STRINGL(s, l) renvoie une chaîne. Le deuxième paramètre est la longueur de la chaîne. 🎜RETURN_EMPTY_STRING() Renvoie une chaîne vide. 🎜RETURN_ARR(r) Renvoie un tableau. Les paramètres sont des pointeurs zend_array*. 🎜RETURN_OBJ(r) renvoie un objet. Les paramètres sont des pointeurs zend_object*. 🎜RETURN_ZVAL(zv, copy, dtor) renvoie n'importe quel type. Les paramètres sont des pointeurs zval*. 🎜RETURN_FALSE Renvoie faux🎜RETURN_TRUE Renvoie vrai🎜🎜

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer