赤い部分は私の注釈です。
詳細については、以下を参照してください:
1. よく使用される一般的な関数は、zen_API.h などのヘッダー ファイルにカプセル化されているため、内部の詳細を調べて時間を無駄にする必要はありません。 (参照: PHP の拡張と埋め込みの付録 A)
2. ターミナルでテスト プログラムを実行すると、拡張機能の内部エラー出力が表示されます。これはメモリ リークの問題を解決するために特に重要です。 (デバッグ ライブラリをコンパイルします)
3. 開発プロセス中に、Makefile の「CFLAGS = -g -O2」を変更し、最適化オプションを削除し、デバッグを容易にしてコンパイル警告を表示するために -Wall と -pedantic を追加します。 🎜>4 。特定の zval* の場合、その strval はコピーされません。zval_ptr_dtor(zval**) は使用できません。efree(void*) を使用する必要があります。
5. ターミナルの $_SERVER['PWD'] には値がありますが、zend_getenv() では取得できません。その理由は、値が無意味であるか信頼できないためです。
6. 「エクスポートされた関数」を呼び出す場合、INTERNAL_FUNCTION_PARAM_PASSTHRU を使用してパラメーターを渡すことができます。宣言された非エクスポート関数は、INTERNAL_FUNCTION_PARAM を通じて「エクスポートされた関数」のパラメーターを使用できます。
7. 注: RETURN_TYPE を使用して除算の合計ループなどを選択する場合は、中括弧
で囲むか、セミコロンを付けずに配置するのが最善です。理由は次のとおりです。 #define RETURN_BOOL(b) { RETVAL_BOOL (b); を返します。
8. 関数のパラメータが参照で非スカラーの場合、メモリ リークを防ぐために、最初にそれらを破棄する必要があります。
9. 例外をスローする前に、EG に既に例外 (例外) があるかどうかを確認することが最善です。そうしないと、メモリ リークが発生します。
10. WebサーバーAPIがISAPI(IIS)の場合、zend_getenv関数は動作しません。
11. zend_stack_push() にデータ ポインタを渡します。実際に格納 (コピー) されるのは、ポインタが指すデータです。つまり、渡されるのは格納されるデータのポインタです。
ZEND_API int zend_stack_push(zend_stack *stack, void *element, int size);
ZEND_API int zend_stack_top(zend_stack *stack, void **element); ここで、size == sizeof(*element);
同様に、zend_hash にも同じことが当てはまります。zend_hash_update と zend_hash_find を比較してください。
12. zval の代わりに add_assoc_zval(HashTable*, const char*, zval*) を使用します。したがって、
ユーザーによって渡されたパラメーターを保存する場合は、最初に新しい zval をコピーする必要があります。予測できないことが起こるかもしれません。
13.zval_dtor(zval*) は、変数とその内部参照メモリを解放します。zval_ptr_dtor(zval**) は、zval_dtor(zval*) を呼び出すかどうかを決定する前に、まず refcount
をチェックします。 deep Copy、つまり、
によって内部的に参照されるメモリのみをコピーします。
14. VC を使用して win ダイナミック リンク ライブラリと zend_getenv などをコンパイルする場合。 、コード内で呼び出され、zend では .h は次のように定義されます:
extern "C" {
extern ZEND_API char *(*zend_getenv)(char *name, size_t name_len TSRMLS_DC);
}
ZEND_API を使用する場合は、事前に LIBZEND_EXPORTS (VC の「設定」の前処理定義を含む) をキャンセルするか、ZEND_DLIMPORT、
を使用する必要があります。 ZEND_DLIMPORT char *(*zend_getenv)(char *name, size_t name_len TSRMLS_DC ; 🎜># ZEND_API __declspec(dllexport) を定義
#else
# ZEND_API __declspec(dllimport) を定義
#endif
#define ZEND_DLEXPORT __declspec(dllexport)
#define ZEND_DLIMPORT __declspec(dllimport) executor_globals_id も次のように宣言する必要があります。 ZEND_DLIMPORT int executor_globals_id
(これは、特定の拡張機能を手動でコンパイルしたい場合 (sqlite3 拡張機能をコンパイルしたときにこの問題が発生した場合など)。