私はCを使ってPHP拡張を開発しています。これまでは、PHPユーザー空間から拡張関数に渡された引数の適切な検証に取り組んでいます。ZEND_BEGIN_ARG_INFO_EXをPHP拡張モジュールに渡す引数の数を制御する方法は?
マクロZEND_BEGIN_ARG_INFO_EX
を使用すると、関数の引数に関する情報をZend Engineに提供できます。 required_num_args
という名前のマクロの4番目のパラメータは、エンジンが引数の数を自動的に制御して、私からこの面倒を取り除きます。しかし、私はそれを動作させる方法を見つけることができませんでした。PHPスクリプトが十分な引数を渡さなくても、エンジンは常に警告なしで拡張機能を実行します。ここで
は、関数の引数の私の定義である:ここでは
ZEND_BEGIN_ARG_INFO_EX(test_func_swt_arginfo, 0, 0, 3)
ZEND_ARG_INFO(1, firstArg)
ZEND_ARG_ARRAY_INFO(0, secondArg, true)
ZEND_ARG_OBJ_INFO(1, thirdArg, SomeClass, false)
ZEND_END_ARG_INFO()
はPHP拡張モジュールによってエクスポートされ、機能の私の定義である:ここでは
static const zend_function_entry test_func_functions[] = {
PHP_FE(sample_with_types, test_func_swt_arginfo)
PHP_FE_END
};
は私の関数である。
PHP_FUNCTION(sample_with_types)
{
RETURN_TRUE;
}
実行しているPHPスクリプトは次のとおりです。
<?php
sample_with_types();
期待される結果:PHPはエラー/警告/例外などを表示します。"十分な引数が関数に渡されません";関数は実行されません。
実際の結果:この関数は実行され、true
を返します。
Zend Engineが引数の数を自動的にチェックするように、関数の引数構造を正しく設定するにはどうすればよいですか?または、私はrequired_num_args
引数の目的を間違ってZEND_BEGIN_ARG_INFO_EX
マクロに入れていますか?
このマクロの目的を明確にするための情報と努力については、@netcoderありがとうございます。それはかなり意味をなさない、そして実際に私は質問をする前にそれを発見した。しかし、私の困惑を引き起こし、私をSOにした主なものは、 'required_num_args'パラメータでした。 args numの自動検証のようですが、実際には何もしません。あなたはその目的を知っているでしょうか? –
@AndreyTserkus: 'required_num_args'は、リフレクションに使用され、必要に応じて(' isOptional() 'を呼び出すとき)、パラメータのカウントをいつ停止するかを示します。それ以外の効果はありません。 (私もこの情報で答えを更新しました) – netcoder
素晴らしい、ありがとう! –