Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Erweiterungsentwicklung – Verwirrung durch zwei zend_api während der PHP-Erweiterungsentwicklung

PHP-Erweiterungsentwicklung – Verwirrung durch zwei zend_api während der PHP-Erweiterungsentwicklung

WBOY
WBOYOriginal
2016-09-06 08:57:08959Durchsuche

Mein Erweiterungscode sieht so aus

<code>ZEND_BEGIN_ARG_INFO_EX(helloZvalArg, 0, 0, 1)
    ZEND_ARG_INFO (0, name)
    ZEND_ARG_INFO (0, age)
    ZEND_ARG_INFO (0, zval_args)
ZEND_END_ARG_INFO()



PHP_FUNCTION(debug_zval)
{
    zend_string *name, *age;
    zval zval_args;
    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SSz", &name, &age, &zval_args) == FAILURE){
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "参数接受错误");
        RETURN_FALSE;
    }

    php_printf("zval_args的type类型:%d\n", Z_TYPE(zval_args));
    ZVAL_STR(&zval_args, name);
    php_printf("将name复制后的zval_args的type类型:%d\n",Z_TYPE (zval_args));
    php_printf("named:%s\n",name->val);
    php_printf("age:%s\n",age->val);
    zval_ptr_dtor(&zval_args);
}</code>

PHP-Code

<code><?php
$br = (php_sapi_name() == "cli")? "":"<br>";

if(!extension_loaded('helloZval')) {
    dl('helloZval.' . PHP_SHLIB_SUFFIX);
}
debug_zval("sss",2,4);

?>
</code>

Ausgabe

<code>zval_args的type类型:0    (IS_UNDF)
将name复制后的zval_args的type类型:6(IS_STRING)                                                                                  
named:sss
age:2</code>

Ich habe zwei Zweifel

  • Wenn ich zval als Container zum Empfangen von Parametern verwende (nennen wir es so), warum erhalte ich dann nicht die Parameter erfolgreich, sondern IS_UNDEF

  • Wenn zval nicht als Parametercontainer verwendet werden kann, was ist dann der Unterschied zwischen zend_string und anderen gleichzeitig definierten Typen (wie zend_array, zend_object...) und zval (sowohl zend_string als auch zval kann GC und zend_string leichter sein) oder was ist der Unterschied zwischen der Verwendung von zval und zend_string?

Antwortinhalt:

Mein Erweiterungscode sieht so aus

<code>ZEND_BEGIN_ARG_INFO_EX(helloZvalArg, 0, 0, 1)
    ZEND_ARG_INFO (0, name)
    ZEND_ARG_INFO (0, age)
    ZEND_ARG_INFO (0, zval_args)
ZEND_END_ARG_INFO()



PHP_FUNCTION(debug_zval)
{
    zend_string *name, *age;
    zval zval_args;
    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "SSz", &name, &age, &zval_args) == FAILURE){
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "参数接受错误");
        RETURN_FALSE;
    }

    php_printf("zval_args的type类型:%d\n", Z_TYPE(zval_args));
    ZVAL_STR(&zval_args, name);
    php_printf("将name复制后的zval_args的type类型:%d\n",Z_TYPE (zval_args));
    php_printf("named:%s\n",name->val);
    php_printf("age:%s\n",age->val);
    zval_ptr_dtor(&zval_args);
}</code>

PHP-Code

<code><?php
$br = (php_sapi_name() == "cli")? "":"<br>";

if(!extension_loaded('helloZval')) {
    dl('helloZval.' . PHP_SHLIB_SUFFIX);
}
debug_zval("sss",2,4);

?>
</code>

Ausgabe

<code>zval_args的type类型:0    (IS_UNDF)
将name复制后的zval_args的type类型:6(IS_STRING)                                                                                  
named:sss
age:2</code>

Ich habe zwei Zweifel

  • Wenn ich zval als Container zum Empfangen von Parametern verwende (nennen wir es so), warum erhalte ich dann nicht die Parameter erfolgreich, sondern IS_UNDEF

  • Wenn zval nicht als Parametercontainer verwendet werden kann, was ist dann der Unterschied zwischen zend_string und anderen gleichzeitig definierten Typen (wie zend_array, zend_object...) und zval (sowohl zend_string als auch zval kann GC und zend_string leichter sein) oder was ist der Unterschied zwischen der Verwendung von zval und zend_string?

Stellungnahme:
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