>  기사  >  백엔드 개발  >  PHP7 확장 개발의 반환 값을 설명하는 예

PHP7 확장 개발의 반환 값을 설명하는 예

藏色散人
藏色散人앞으로
2021-10-15 16:32:332796검색

머리말

이번에는 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 튜토리얼"]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

default_value 메소드 구현 h2>
default_value 메소드 PHP 확장 소스 코드:
rrreee

코드 설명

매개변수 가져오기


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 유형으로 변환합니다. 🎜🎜또한 주의가 필요한 몇 가지 지정자가 있습니다: 🎜! PHP 언어에서 null 변수를 받으면 이를 IS_NULL 타입의 zval로 캡슐화하는 대신 C 언어에서 직접 NULL로 변환한다. 🎜/ 전달된 변수가 다른 변수와 zval을 공유하고 참조가 아닌 경우 강제로 분리됩니다. 새로운 zval의 is_ref__gc==0 및 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 지정자와 일대일로 대응된다는 점에 주목할 필요가 있습니다. 예: 🎜Z_PARAM_OPTIONAL은 |🎜Z_PARAM_STR에 해당하고 S🎜에 해당합니다. 그러나 Z_PARAM_ZVAL_EX 방법은 특별합니다. 이는 두 개의 지정자, 즉 ! 및 /에 해당합니다. ! 매크로 메소드의 두 번째 매개변수에 해당합니다. /는 매크로 메소드의 세 번째 매개변수에 해당합니다. 활성화하고 싶다면 1로 설정하면 됩니다. 🎜🎜FAST ZPP의 해당 매크로 메서드는 공식 웹사이트 https://wiki.php.net/rfc/fast_zpp#proposal🎜

반환 값

🎜메서드의 반환 값은 다음과 같습니다. RETURN_을 사용하세요. code>로 시작하는 매크로 메서드가 반환됩니다. 일반적으로 사용되는 매크로 메서드는 다음과 같습니다. 🎜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 확장 개발의 반환 값을 설명하는 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제