Значение, возвращаемое функцией расширения PHP, равно NULL. - PullRequest
0 голосов
/ 25 июня 2011

Я наткнулся на интересный случай при разработке расширения для PHP.В коде расширения у меня есть:

PHP_FUNCTION(foo)
{
   ....
   php_debug_zval_dump(return_value, 1);
}

В коде PHP:

$v = foo();
debug_zval_dump($v);

При запуске выше, я получаю:

string(19) "Mouse configuration" refcount(1)
NULL refcount(2)

Что может бытьпричина, по которой значение не передается должным образом из расширения?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 июня 2011

Это не так странно.

Например, если вы сделали return_value = some_string_zval;, вы бы изменили только локальную переменную. php_debug_zval_dump будет работать, но это не будет иметь никакого эффекта вне функции. Вы должны активно копировать zval, например, с:

ZVAL_COPY_VALUE(return_value, my_string_zval_p);
zval_copy_ctor(return_value);

Единственный случай, когда вы могли вернуться из внутренней функции, просто копируя указатель вместо копирования данных, был, если эта функция возвращалась по ссылке. В этом случае вам дают zval**.

0 голосов
/ 26 июня 2011

Вы получаете NULL, потому что debug_zval_dump () имеет встроенную функцию эха, и вы не можете установить эхо для переменной. Таким образом, ваш $ v = foo () фактически дает вам $ v = "". Причина, по которой вы получаете счет 2 для пустой переменной, связана с внутренней оптимизацией PHP.

Читайте об этом здесь: http://us3.php.net/manual/en/function.debug-zval-dump.php

Таким образом, чтобы вернуть ваше значение правильно, вы можете:

  1. Подавить встроенное эхо, записав его в буфер
  2. Установить результат буфера в переменную
  3. Запустите ваш второй debug_zval_dump () для этой (не NULL) переменной

Вот как это работает:

function myfunc($foo)
{
  debug_zval_dump($foo, 1);
}
ob_start();
/*
starts the output buffer which will catch all code instead of echoing it to page
*/
myfunc('Mouse configuration');

$v = ob_get_contents();
/*
writes the buffer which contains your f(x) results to a var
*/

ob_end_clean();//clears the buffer

debug_zval_dump($v);//will echo non-null value

Код будет с таким:

string (65) "string (19)" Конфигурация мыши "refcount (3) long (1) refcount (1)" refcount (2)

Я понятия не имею, для чего предназначен этот код, но, в любом случае, удачи. :)

...