タイトルについて詳しく説明します。たとえば、PHP_FUNCTION(session_start) を考えてみましょう。別の PHP_FUNCTION である session_id 内から session_start を呼び出すことはできますか (これは実際の目的ではなく説明のためのものです)。
2 に答える
ええ、そうですが、できるだけ避けるべきです。関数の内部実装を作成する主な利点の1つは、PHPで行われることとは異なり、C関数の呼び出しが安価であることです。さらに、Cコードで内部的にPHP関数を呼び出すのは比較的面倒です。
たとえば、の場合、セッション拡張によって公開されるがありますsession_start
。php_session_start
最初の段落で説明したことにより、拡張機能は通常、他の人に役立つ可能性のあるC関数をエクスポートします。
実際、内部PHP関数foo
を呼び出すために必要な内部PHP関数bar
は、可能であれば、PHP_FUNCTION
の実装のほとんどで補助(非)C関数を定義するのが最善の戦略ですbar
。次に、両方PHP_FUNCTION(foo)
とPHP_FUNCTION(bar)
その補助関数を呼び出すことができます。
とにかく、PHP関数を呼び出す最も簡単な方法は次を使用することcall_user_function
です:
int call_user_function(HashTable *function_table, zval **object_pp,
zval *function_name, zval *retval_ptr, zend_uint param_count,
zval *params[] TSRMLS_DC);
このバリアントcall_user_function_ex
では、引数を参照によって送信する必要がある場合に分離を禁止し、シンボルテーブルを指定することもできます。
これは、関連する関数が内部(PHP_FUNCTION
)であるか、ユーザースペースで定義されている場合の両方で機能します。通常の関数の場合はEG(function_table)
、最初の引数として使用する必要があり、2番目の引数はNULLである必要があり、他の引数を理解できると思います。
関数を数回実行する場合、これはあまり効率的ではありません。その場合は、「Zend_API.h」ので始まる関数をご覧くださいzend_fcall_
。
引数スタックやその他のトリックを手動で設定したり、基になるC関数を手動で呼び出したりするなど、内部関数を呼び出す他のオプションはお勧めしません。
すなわち。session_start(session_id())
session_id()
はい。ただし、この場合は、セッションが既に開始されている必要があるため意味がありません。