C を使用して PHP 拡張機能を開発しています。これまでのところ、PHP ユーザー空間から拡張機能の関数に渡される引数の適切な検証に取り組んでいます。
このマクロZEND_BEGIN_ARG_INFO_EX
を使用して、関数の引数に関する情報を Zend Engine に提供できます。as という名前のマクロの 4 番目のパラメーターを使用するとrequired_num_args
、エンジンが引数の数を自動的に制御できるようになり、この手間が省けます。しかし、それを機能させる方法を見つけることができませんでした。エンジンは、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