1 関数の戻り値
ついに zval についての話が終わりました。先ほど関数の定義と使い方について話しましたが、関数の戻り値については話していませんでした。 C 拡張では関数の戻り値の型が zval であるため、このセクションを説明のためにここに置きます。
このセクションの課題では、加算、減算、乗算、除算の演算を完了するための簡単な計算機を作成します。 要件: 関数 Calculate(num1, num2, opt) を作成します。 num1 opt num2=?手術。上記のタスクを実行するコードを見てみましょう:
PHP_FUNCTION(計算)
{
int num1;
int num2;
char* オプション;
int opt_len;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lls",
)
&num1、&num2、&opt、&opt_len) ==失敗)
{
php_printf("パラメータエラー。例:calculate(123, 456, '+')n");
RETURN_NULL();
}
if(1 != opt_len)
{
php_printf("パラメータエラー。例:calculate(123, 456, '+')n");
RETURN_NULL();
}
スイッチ(opt[0])
{
ケース「+」:
return_value->type = IS_LONG;
スルー スルー スルー スルー スルー アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト
休憩;
ケース「-」:
return_value->type = IS_LONG;
num1 - num2 を使用します。
休憩;
ケース「*」:
return_value->type = IS_LONG;
return_value->value.lval = num1 * num2;
休憩;
ケース「/」:
return_value->type = IS_DOUBLE;
return_value->value.lval = num1 * 1.0 / num2;
休憩;
デフォルト:
return_value->type = IS_LONG;
return_value->value.lval = 0;
休憩;
}
}
上記のコードを見て、return_value がどこから来たのかについて疑問を感じませんか?
return_value はマクロ PHP_FUNCTION で定義されています。PHP_FUNCTION はこの変数を宣言し、この変数を NULL に割り当てます。
マクロの定義を見てみましょう。
#define ZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS)
#define ZEND_FUNCTION(名前) ZEND_NAMED_FUNCTION(ZEND_FN(名前))
#define INTERNAL_FUNCTION_PARAMETERSint ht, zval *return_value,
zval **return_value_ptr、zval *this_ptr、intreturn_value_used TSRMLS_DC
上記のマクロ定義から、return_value は zval へのポインターです。PHP はこの変数を使用して関数の戻り値を指します。実際、単純な戻り値を実行できるマクロも用意されています。マクロ定義は次のとおりです。 RETVAL_*(v)、* はさまざまな変数タイプを表し、v は変数の値を表します (例: RETVAL_LONG(34))。その値は 34 です。
http://www.bkjia.com/PHPjc/477781.html
www.bkjia.comtruehttp://www.bkjia.com/PHPjc/477781.html技術記事 1 関数の戻り値 ようやく zval についての説明が終わりました。先ほど関数の定義と使用法について説明しましたが、関数の戻り値については説明していませんでした。 C拡張では関数の戻り値の型がzvalなので…