PHP拡張機能:いくつかの興味深い機能

PHPの拡張機能をC ++で頻繁に記述する必要はありませんが、必要な場合、このトピックに関する出版物やドキュメントはそれほど多くないことがわかります。 特にもう少し掘り下げた場合。 「自分の肌で」見つけなければならない興味深い点をいくつか説明します。



拡張機能コード(C ++で記述していることを思い出します)のPHP関数から呼び出す場合、予期しない困難が待っています。 これを行うために、call_user_function_ex関数が提供されていますが、 その例を見つけるのはそれほど難しくありません。 PHPから呼び出されるC ++関数から呼び出しを行うと問題が発生します。 そのような関数は次のように宣言されます。



ZEND_FUNCTION(MyFunction) { … }
      
      







それの外側でcall_user_function_exを呼び出した後、拡張機能はコンパイルを停止します。

手がかり(および解決策)はもちろん、関数定義にいくつかのパラメーターを追加するZEND_FUNCTIONマクロの定義にあります。 PHPにアクセスしたい場所から関数に渡す以外に選択肢はありません。 次のようになります。



 ZEND_FUNCTION(MyFunction) { ... char *result = myInnerFunction ( CG ( function_table ), tsrm_ls ); ... } char *myInnerFunction ( HashTable *function_table, void ***tsrm_ls ) { ... call_user_function_ex(...); ... }
      
      







C ++からPHP構造を操作するもう1つの興味深い機能は、PHP開発者が連想配列の操作を提供してくれたことに関連しています。 PHPでは、このような配列を簡単に操作して、複数階の構造を作成することに慣れています。 C ++では、それらの操作は悪夢に変わります。もちろん、対応するAPIメソッドは提供されますが、言語はそれらをあまり便利にしないでしょう。 たとえば、配列の1レベルを実行するループは次のようになります。



 for (zend_hash_internal_pointer_reset_ex (arr_hash, &pointer); zend_hash_get_current_data_ex (arr_hash, (void**) &data, &pointer ) == SUCCESS; zend_hash_move_forward_ex (arr_hash, &pointer)) { ... }
      
      







C ++で複数階の配列を操作する必要がある場合、これらの手段により、率直に言って、それに遭遇することはありません。

見返りに何を提供できますか? かなり単純で理解可能なオプションは、多階連想配列を2つの単純な2次元配列に拡張することです。 それらの1つには「パックされた」キー、2番目の値が含まれます。 異なるレベルのキーが記号で区切られる行にキーをパックできます。 PHPでこの配列を想像してください。



 $a = Array ( "user" => Array ( Array ( "name" => "Ivanov", "age" => 28), Array ( "name" => "Petrov", "age" => 23) ) );
      
      







C ++では、次のようにパックすると、その中の値をすばやく見つけることができます。



 string keys[] = { "user_0_name", "user_0_age", "user_1_name", "user_1_age" }; string values[] = { "Ivanov", "28", "Petrov", "23" };
      
      






All Articles