Heim > Backend-Entwicklung > PHP7 > Beispiele zur Erläuterung des Rückgabewerts der PHP7-Erweiterungsentwicklung

Beispiele zur Erläuterung des Rückgabewerts der PHP7-Erweiterungsentwicklung

藏色散人
Freigeben: 2023-02-18 08:40:01
nach vorne
2806 Leute haben es durchsucht

Vorwort

Dieses Mal zeigen wir, wie man eingehende Parameter akzeptiert und Rückgabewerte in PHP-Erweiterungen ausgibt.

<?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"));
?>
Nach dem Login kopieren

Wir werden die Methode default_value in der Erweiterung implementieren. [Empfohlen: „PHP7-Tutorial"]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();
}
Nach dem Login kopieren

代码说明

获取参数

在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

Implementieren Sie die Methode default_value h2>
default_value Methode Quellcode der PHP-Erweiterung:
rrreee

Codebeschreibung

Parameter abrufen


In PHP7 gibt es zwei Methoden zum Abrufen von Parametern bereitgestellt. zend_parse_parameters und FAST ZPP-Modus.

zend_parse_parameters


Vor PHP7 wurde die Funktion zend_parse_parameters verwendet, um Parameter zu erhalten. Die Funktion dieser Funktion besteht darin, die eingehenden Parameter in die entsprechenden Typen im PHP-Kernel umzuwandeln, damit sie in PHP-Erweiterungen verwendet werden können.
Parameterbeschreibung:
Der erste Parameter, die Anzahl der Parameter. Im Allgemeinen verwenden Sie einfach ZEND_NUM_ARGS(), keine Änderung erforderlich.
Der zweite Parameter ist die Formatzeichenfolge. Die Funktion dieser Formatzeichenfolge besteht darin, die Konvertierungsbeziehung zwischen den eingehenden Parametern und dem PHP-Kerntyp anzugeben.

Die Bedeutung von S|z im Code ist: S bedeutet, dass der Parameter eine Zeichenfolge ist. Konvertieren Sie die eingehenden Parameter in den Typ zend_string.
|. bedeutet, dass die folgenden Parameter optional sind. Es kann weitergegeben werden oder nicht. 🎜z gibt an, dass es sich bei den Parametern um mehrere Typen handelt. Konvertieren Sie die eingehenden Parameter in den ZVAL-Typ. 🎜🎜Darüber hinaus gibt es einige Spezifizierer, die Aufmerksamkeit erfordern: 🎜! Wenn eine Nullvariable in der PHP-Sprache empfangen wird, wird sie direkt in NULL in der C-Sprache konvertiert, anstatt sie in ein zval vom Typ IS_NULL zu kapseln. 🎜/ Wenn die übergebene Variable einen Zval mit anderen Variablen teilt und keine Referenz ist, wird eine erzwungene Trennung durchgeführt. Der neue Zval ist_ref__gc==0 und refcount__gc==1.🎜🎜Weitere Bedeutungen formatierter Zeichenfolgen finden Sie im offiziellen Webseite. https://wiki.php.net/rfc/fast_zpp🎜

FAST ZPP

🎜Neue Methode in PHP7 bereitgestellt. Es dient dazu, die Leistung der Parameteranalyse zu verbessern. Für häufig verwendete Methoden empfiehlt sich die Verwendung der FAST ZPP-Methode. 🎜So verwenden Sie: 🎜Beginnen Sie mit ZEND_PARSE_PARAMETERS_START(1, 2). 🎜Der erste Parameter gibt die Anzahl der Parameter an, die übergeben werden müssen, und der zweite Parameter gibt die maximale Anzahl der Parameter an, die übergeben werden können. 🎜Ende mit ZEND_PARSE_PARAMETERS_END();. 🎜Die Mitte ist das Parsen der eingehenden Parameter. 🎜Es ist erwähnenswert, dass die Makromethode von FAST ZPP im Allgemeinen eins zu eins dem Spezifizierer von zend_parse_parameters entspricht. Zum Beispiel: 🎜Z_PARAM_OPTIONAL entspricht |🎜Z_PARAM_STR entspricht S🎜Die Methode Z_PARAM_ZVAL_EX ist jedoch etwas Besonderes. Es entspricht zwei Spezifizierern, nämlich ! und /. ! Entspricht dem zweiten Parameter der Makromethode. / entspricht dem dritten Parameter der Makromethode. Wenn Sie es aktivieren möchten, setzen Sie es einfach auf 1. 🎜🎜Die entsprechende Makromethode von FAST ZPP kann auf der offiziellen Website https://wiki.php.net/rfc/fast_zpp#proposal eingesehen werden🎜

Rückgabewert

🎜Der Rückgabewert der Methode ist to Verwenden Sie RETURN_Die Makromethode, die mit code> beginnt, gibt zurück. Häufig verwendete Makromethoden sind: 🎜RETURN_NULL() Gibt null zurück🎜RETURN_LONG(l) Gibt den Ganzzahltyp zurück🎜RETURN_DOUBLE(d) Gibt den Gleitkommatyp zurück🎜RETURN_STR(s) Gibt einen String zurück. Der Parameter ist ein zend_string * Zeiger 🎜RETURN_STRING(s) Gibt einen String zurück. Der Parameter ist ein char * Zeiger 🎜RETURN_STRINGL(s, l) gibt einen String zurück. Der zweite Parameter ist die Stringlänge. 🎜RETURN_EMPTY_STRING() Gibt eine leere Zeichenfolge zurück. 🎜RETURN_ARR(r) Gibt ein Array zurück. Parameter sind zend_array*-Zeiger. 🎜RETURN_OBJ(r) gibt ein Objekt zurück. Parameter sind zend_object*-Zeiger. 🎜RETURN_ZVAL(zv, copy, dtor) gibt einen beliebigen Typ zurück. Parameter sind zval*-Zeiger. 🎜RETURN_FALSE Gibt „false“ zurück🎜RETURN_TRUE Gibt „true“ zurück🎜🎜

Das obige ist der detaillierte Inhalt vonBeispiele zur Erläuterung des Rückgabewerts der PHP7-Erweiterungsentwicklung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage