ユーザー関数のコール方法
ユーザー関数を内部関数からコールするには、
call_user_function() 関数を
使用する必要があります。
call_user_function() は成功時に SUCCESS、
関数を見つけられなかった場合に FAILURE を返します。
返り値を確認する必要があります!
SUCCESS が返された場合、
retval pval 自体(または関数からの返り値として
それを返す)を破棄する責任があります。
FAILURE が返された場合、retval の値は未定義であり、参照することは
できません。
ユーザー関数をコールする全ての内部関数は、再入可能(reentrant)
である 必要があります。
特に、このことは、グローバルまたは静的変数を使用するべきでは
ないということを意味します。
call_user_function() は次の 6個の引数をとります。
HashTable *function_table
これは、関数を参照できるハッシュテーブルです。
pval *object
これは、関数がコールされるオブジェクトへのポインタです。
グローバル関数がコールされた場合、このポインタは、NULL で
ある必要があります。
NULL でない (すなわち、オブジェクトを指している)場合、
function_table 引数は無視され、かわりにオブジェクトのハッシュから
とられます。
オブジェクトは、コールした関数により修正可能な場合があります。
(関数は、$this によりアクセスすることが可能です。)
何らかの理由で、こうしたことを避けたい場合、
オブジェクトのコピーを代わりに送付します。
pval *function_name
コールする関数の名前。
function_name.str.val および function_name.str.len に適当な
値を設定した IS_STRING 型の pval である必要があります。
function_name は、call_user_function() により修正されます。
この時、function_name は、小文字に変換されます。
大文字・小文字を保存する必要がある場合、関数名のコピーを代わりに
送って送ってください。
pval *retval
コールされた関数の返り値が保存された pval 構造体へのポインタ。
構造体は、事前に確保されたものである必要があります。
call_user_function() はそれ自体では
リソースの確保を行いません。
int param_count
関数に渡されたパラメータの数
pval *params[]
関数の引数として渡される値へのポインタの配列、最初の引数は
オフセット 0 にあり、2番目はオフセット 1 にあります。
配列は、pval へのポインタの配列です。
ポインタは、関数にそのまま送られます。
このことは、関数が引数を修正した場合、元の値が変更される(参照渡し)
ことを意味します。
この動作が好ましくない場合、コピーを代わりに渡してください。