赤い部分は私の注釈です。
詳細については、以下を参照してください:
1. よく使用される一般的な関数は zen_API.h などのヘッダー ファイルにカプセル化されているため、内部の詳細を調べて時間を無駄にする必要はありません。 (参照: PHP の拡張と埋め込みの付録 A)
2. ターミナルでテスト プログラムを実行すると、拡張機能の内部エラー出力が表示されます。これはメモリ リークの問題を解決するために特に重要です。 (デバッグ ライブラリをコンパイルします)
3. 開発プロセス中に Makefile の「CFLAGS = -g -O2」を変更し、最適化オプションを削除し、デバッグを容易にしてコンパイル警告を表示するために -Wall と -pedantic を追加します。特定の zval* がありますが、その strval はコピーされません。 zval_ptr_dtor(zval**) は使用できません。 efree(void*) を使用する必要があります。ターミナルの
5.$_SERVER['PWD'] には値がありますが、zend_getenv() では取得できません。その理由は、値が無意味であるか信頼できないためです。
6. 「エクスポートされた関数」を呼び出す場合、INTERNAL_FUNCTION_PARAM_PASSTHRU を使用してパラメーターを渡すことができます。宣言された非エクスポート関数は、INTERNAL_FUNCTION_PARAM を通じて「エクスポートされた関数」のパラメーターを使用できます。
7. 注: RETURN_TYPE を使用して除算の合計ループなどを選択する場合は、中かっこで囲むか、セミコロンを付けずに配置するのが最善です。次の理由からです。戻る; }。
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);
同様に、zend_hash もそうです。 、zend_hash_update と zend_hash_find を比較します。
12. zval の代わりに add_assoc_zval(HashTable*, const char*, zval*) を使用して zval* を保存します。 したがって、ユーザーによって渡されたパラメーターを保存する場合は、まず新しい zval をコピーする必要があります。そうしないと、エラーが発生します。 . 期待できること。
13.zval_dtor(zval*) は変数とその内部参照メモリを解放します。 zval_ptr_dtor(zval**) はまず refcount をチェックし、次に zval_dtor(zval*) を呼び出すかどうかを決定します。zval_copy_dtor(zval*) はディープ コピーのみを実行します。つまり、
14 をコピーせずに内部参照メモリのみをコピーします。 VC を使用して win ダイナミック リンク ライブラリをコンパイルし、zend_getenv などの zend 関数がコード内で呼び出される場合、これは次のように定義されます。 zend.h as:
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_config.w32.h
コードをコピーします
コードは次のとおりです:
#ifdef LIBZEND_EXPORTS
http://www.bkjia.com/PHPjc/321343.html