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"));
?>
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();
}
代码说明
获取参数
在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:
rrreeeCodebeschreibung
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🎜
🎜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
. 🎜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
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🎜
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!