2011-06-25 23 views
0

PHP用の拡張機能を開発しているときに面白いケースがありました。延長コードでは私が持っている:PHP拡張関数から返される値がNULLです

PHPコードで
PHP_FUNCTION(foo) 
{ 
    .... 
    php_debug_zval_dump(return_value, 1); 
} 

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

上記を実行している場合は、私が取得:

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

値ISNその理由ことができるものエクステンションから正しく渡されましたか?

ありがとうございます!

+0

あなたのphp関数の詳細を表示する必要があります。以前は間違ったことをする可能性が最も高いです。また、出力に3つの "refcount(x)"があるのはなぜですか?あなたのスニペットは2つしか説明しません。 – Artefacto

+0

はい、私は間違ったことをしていました(私はすでにそれを修正しました)。 'php_debug_zval_dump(return_value、1)'は正しく渡されなかったにもかかわらず正しい値を出力したのは不思議です。 – spektom

答えて

0

それはそれほど奇妙ではありません。あなたは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

エコー機能を内蔵しており、あなたが変数にエコーを設定することはできませんにdebug_zval_dump()ので、あなたは、NULLを取得しています。あなたの$ v = foo()は実際にあなたに$ v = ""を与えています。空変数の2の参照を取得する理由は、固有のPHP最適化のためです。ここではそのことについて

読む:http://us3.php.net/manual/en/function.debug-zval-dump.php

そうすることができます適切に値を戻す:

  1. が抑制内蔵のエコーバッファ結果にを設定し、バッファ
  2. にエコーを書き込むことにより、変数
  3. 変数
その上の2番目にdebug_zval_dump()(ないNULL)を実行します(3)長期

文字列(65)「文字列(19) "マウスの設定" 参照カウント(1)参照カウント(1):コードはこれになります

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 

:ここ

は、それがどのように動作するかです「参照カウント(2)

私はこのコードが、とにかくやるけどグッドラックすることが何を意味するか分かりません。 :)

関連する問題