ホームページ >php教程 >php手册 >独自の PHP 拡張関数を作成する

独自の PHP 拡張関数を作成する

WBOY
WBOYオリジナル
2016-06-13 12:45:01888ブラウズ


独自の PHP 拡張関数を作成する 私は長い間 PHP プログラムを書いているので、PHP が提供する機能はよく知っています。PHP が提供する機能はとても便利ですが、時々 PHP に足りない機能に気づき、PHP に追加したいと思うことがあります。 . カスタム機能のアイデア。時間が経つにつれて、今日はついに我慢できなくなり、追加する方法を研究し始めました。



ここで使用するバージョンは php 4.0.5 です。解凍すると、php のルート ディレクトリに README.EXT_SKEL のようなファイルが表示されます。詳しく読んだところ、このツールは空の php 拡張機能を構築するのに役立ち、それに対応するコードを追加して独自の関数拡張機能を完成させることができます。以下にこのツールの使い方を紹介します。



まず、基本的な拡張フレームワークのみが必要な場合は、ディレクトリを php ディレクトリの下の ext ディレクトリに転送します。

./ ext_skel -- extname=module_name

module_name は、選択できる拡張モジュールの名前です。たとえば、私は my_module を選択しました。ツールを実行すると、選択した module_name のディレクトリが ext ディレクトリに自動的に作成されます。これらのコードでは、config.m4 ファイル内の 3 行のコメントを調整するだけで済みます。このカスタマイズを使用して正常にコンパイルするには、PHP 用の拡張モジュールを使用します。 phpのルートディレクトリで以下の操作を行うことで取得できます。

./buildconf

./configure --enable-module_name

make



次に、my_module の確立を示します。拡張フレームワーク プロセス全体をより効果的にするために、PHP でこの関数を呼び出すと、Web ページに古典的な単語「hello world」を表示できるようになります。

php ディレクトリの下の ext ディレクトリで、次のコマンドを実行します。

./ext_skel --extname=my_module

フィードバック結果を取得します:

ディレクトリ my_module の作成

基本ファイルの作成: config.m4 Makefile.in .cvsignore my_module.c php_my_module.h testing/001.phpt my_module.php [done].



新しい拡張機能を使用するには、次の手順を実行する必要があります:

1. $ cd ..

2. $ vi ext/my_module/config.m4

3. $ ./buildconf

4. $ ./configure --[with|enable]-my_module

5. $ make

6. - f ext/my_module/my_module.php

7. $ vi ext/my_module/my_module.c

8. $ make



手順を繰り返します。 ext/my_module/config.m4 に満足するまで 3 ~ 6 を実行し、

ステップ 6 でモジュールが PHP にコンパイルされたことを確認します。その後、

コードの作成を開始し、最後の 2 つのステップを繰り返します。



上記を理解できる場合は、実行してください。よく理解できない場合は、以下のヒントに従ってください。

Cd my_module

最初にmy_module目录

vi config.m4

使用文本编辑器打开config.m4文件,文件内容大致如下:

dnl $Id$

拡張機能 my_module の dnl config.m4

dnl PHP_EXTENSION(my_module)


dnl このファイルのコメントは文字列 'dnl' で始まります。

dnl 必要に応じて削除します。このファイルは編集しないと機能しません

dnl。



dnl 拡張機能が外部のものを参照する場合は、



とともに使用します。 dnl PHP_ARG_WITH(my_module, for my_module support,

dnl コメントが整列していることを確認してください:

dnl [ --with-my_module Include my_module support])



dnl それ以外の場合は、enable を使用します:



dnl PHP_ARG_ENABLE(my_module, my_module サポートを有効にするかどうか,

dnl コメントが整列していることを確認してください:

dnl [ --enable-my_module my_module サポートを有効にする])



if test "$PHP_MY_MODULE" != "no"; then

dnl

dnl ヘッダー、ライブラリ、関数の存在など、外部のものをテストしない場合は、

dnl 次の行のコメントを解除するだけで、

dnl ここにテストの例をさらに書いてください...

PHP_EXTENSION(my_module, $ext_shared)

Fi



你自己による选择将

dnl PHP_ARG_WITH(my_module, for my_module support,

dnl コメントが整列していることを確認してください:

dnl [ --with- my_module my_module support を含める])

修正

PHP_ARG_WITH(my_module, for my_module support,

コメントが揃っていることを確認してください:

[ - -with-my_module my_module サポートを含める])

または、

dnl PHP_ARG_ENABLE(my_module, my_module サポートを有効にするかどうか,

dnl コメントが整列していることを確認してください:

dnl [ --enable-my_module my_module サポートを有効にする])

修正

PHP_ARG_ENABLE(my_module, my_module サポートを有効にするかどうか、

コメントは整列しています:

[ --enable-my_module Enable my_module support])



一般我会選択後者、その後保存退出。

Vi my_module.c

内のファイルの下位コードが変更されます。

/* ユーザーに表示されるすべての関数には、my_module_functions[] にエントリが必要です。

*/

function_entry my_module_functions[] = {

PHP_FE(say_hello, NULL) /* ß追加着一行代码 */

PHP_FE(confirm_my_module_compiled, NULL) /* テストのため、後で削除します。 */

{NULL, NULL, NULL} /* my_module_functions[] の最後の行である必要があります */

};



在文ファイル最後の追加下列代詞

PHP_FUNCTION(say_hello)

{

zend_printf("hello worldn");

}

保存文件退出



vi php_my_module.h

文件中PHP_FUNCTION(confirm_my_module_compiled); 一行先頭追加下面の代償

PHP_FUNCTION(say_hello);

保存ファイル退出



php の根目录下、実行下面のコマンド

./buildconf

./configure --enable-my_module

make



一切の許可がない限り、展開モジュール my_module を php のページにすでに公開しています。 🎜>

Say_hello();

?>

保存文件はsay_hello.php

在phpの根目录下运行

./php –qsay_hello.php

通常情况下会显示

hello world

表示我们的第一个扩展正常的



解释一下面做的操作,ext_skel 生成一部下文件,我们要修正下文

my_module.c 扩展模块的主程序

php_my_module.h 扩展モ块の头文件

config.m4 構成文件



主程序中記述了php扩展モ块の警告、モ块に含まれる量関数、各関数の機能、phpinfo 関数内での内容の表示、モジュールの初期化、これらの内容のすべてがこのファイル内で記述されます。上記では関数 Say_hello を追加し、say_hello 関数の具体的な内容を説明し、PHP で文字列を出力するために zend_printf システム関数を呼び出しました。



は、対応するヘッダー ファイルで Say_hello 関数を宣言し、それによって期待された関数を完成させます。次に、より複雑な拡張機能を作成し、パラメーターを使用して PHP 拡張関数を作成し、指定されたパラメーターに基づいて hello world, xxxx を表示します。 Xxxx は、入力文字列の内容 (my name yorgo など) を表します。



Vi my_module.c

最後のsay_hello 関数の内容を次のように変更します。

PHP_FUNCTION(say_hello)

{

zval **yourname;



if (ZEND_NUM_ARGS() != 1
zend_get_parameters_ex(1, &yourname) == FAILURE)

{

WRONG_PARAM_COUNT;

}



zend_printf("hello world, %sn", Z_STRVAL_PP(あなたの名前));

}

保存して終了します。

php のルート ディレクトリに戻り、

make

を実行し、say_hello.php を


Say_hello( “yorgo ”);

?>

保存して終了し、

を実行します。/php –qsay_hello.php

結果を取得します

hello world, yorgo

は、今回の変更が成功したことを意味します。say_hello のパラメーターを変更して、動的な効果を確認できます。

ここでは主に上記で修正した関数の内容を説明します。say_hello関数はパラメータの導入が必要なため、my_module.cのsay_hello関数で主にパラメータの処理を行い、phpでsay_helloを参照する際にパラメータの内容を埋め込みます。 my_module.c のsay_hello 処理関数に正しく渡されました。この目的のために、これらの数行がプログラムに追加されました。

zval **yourname;

if (ZEND_NUM_ARGS() != 1
zend_get_parameters_ex(1, &yourname) == FAILURE)

{

WRONG_PARAM_COUNT;

}

zend_printf("hello world, %sn", Z_STRVAL_PP(yourname));



コードは次のように説明されます:

zval **yourname;

パラメータ ポインタを初期化します

ZEND_NUM_ARGS()

渡されたパラメータの数を取得し、そうでないかどうかを判断します1 問題があることを示し、エラーを報告します。

zend_get_parameters_ex(1, &yourname)

初期化したばかりのポインタを渡されたパラメータにポイントし、失敗した場合はエラーを報告します。

Z_STRVAL_PP(yourname)

ポインタが指すパラメータを処理し、実際に格納されている値を取得します。

(続く)

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。