2007年01月29日
PHP Extension を作ろう第3回 - クラスを作ろう
今回は PHP Extension でクラスを実装する方法を紹介します。
クラスと言えばオブジェクト指向によるプログラミングに欠かせないシステムであり、PHP にももちろんこの仕組みが用意されていることはご存じかと思います。
クラスを実装するにあたり、インスタンス、プロパティ、メソッドなどと言ったキーワードが登場してきますが、これらをどの様にして PHP Extension で実装していくかを見ていきましょう。
クラスと言えばオブジェクト指向によるプログラミングに欠かせないシステムであり、PHP にももちろんこの仕組みが用意されていることはご存じかと思います。
クラスを実装するにあたり、インスタンス、プロパティ、メソッドなどと言ったキーワードが登場してきますが、これらをどの様にして PHP Extension で実装していくかを見ていきましょう。
最初は PHP4 と PHP5 での PHP Extension の実装方法の違いなども紹介していくつもりだったのですが、PHP4 と PHP5 でクラスに関する仕様が大きく変わっており PHP Extension の実装方法もまた大きく異なっていることを知りました。残念ながら今回は PHP5 での実装方法に限定させた頂きます。
まず最初に今回どの様なクラスを作成するかを以下の PHP コードの実行例で示します。
PHP コード
<?php
$obj = new Example();
echo "$obj->yourname\n";
$obj->hello();
$obj->yourname = "dsas";
$obj->hello();
?>
実行結果
noname
hello, noname
hello, dsas
たった3行の出力を行っているだけですがいろんな要素を含んでいるのでひとつひとつ見ていきます。
まず1行目 new Example(); は Example クラスのオブジェクトを生成しています。同時にコンストラクタが呼ばれています。
2行目は $obj のプロパティである yourname を出力しています、まだこの変数には何の操作も行っていませんがどういう訳か noname と出力されています。これはデフォルトプロパティによるものです。
3行目は $obj の hello メソッドを呼び出しています。単純に "hello, " のあとに yourname プロパティを出力していると言うことが予想出来ると思います。
4行目 で yourname プロパティに代入を行い、5行目で再度 hello メソッドを呼び出すと出力結果が変わっているという流れです。
それでは、前記した動作を行うクラスを実装してみましょう
./ext_skel --extname=example
として既にスケルトンコードの準備が出来ているものとします。
# ビルドの方法については第1回を参照
まず php_example.h の PHP_FUNCTION(confirm_example_compiled); という宣言の次ぐらいに以下を追記します。
static zend_class_entry *example_ce;
次に example.c の MINIT 関数に以下の様にコードを追記します。
PHP_MINIT_FUNCTION(example)
{
zend_class_entry ce;
INIT_CLASS_ENTRY(ce, "Example", example_functions);
example_ce = zend_register_internal_class(&ce TSRMLS_CC);
return SUCCESS;
}
これで "何もしないクラス" が完成しました、この Extension をロードすると。
$obj = new Example();
というコードが実行出来るようになります。(何も起こりませんが)
最初の実行例にあるように Example クラスの yourname プロパティには
"noname" というデフォルト値が設定されています。
この様にデフォルトプロパティ設定するには、example.c の PHP_MINIT_FUNCTION(example) に追記した
example_ce = zend_register_internal_class(&ce TSRMLS_CC); の後に
zend_declare_property_string(example_ce,
"yourname", strlen("yourname"),
"noname", ZEND_ACC_PUBLIC);
この zend_declare_property_string() 関数がデフォルトプロパティを設定する関数で第1引数がクラスエントリ、第2引数がプロパティ名、第3引数がプロパティ名の長さ、第4引数が代入する値、第5引数がプロパティの修飾子となっています。もちろんこの修飾子は Private にもできます。
実行例にあるような hello() メソッドを実装してみます。
php_example.h に
PHP_METHOD(example, hello);
と宣言し
example.c の example_functions に以下のように追記します。
zend_function_entry example_functions[] = {
PHP_FE(confirm_example_compiled, NULL)
PHP_ME(example, hello, NULL, 0)
{NULL, NULL, NULL} /* Must be the last line in example_functions[] */
};
続いて example.c の最後の方に関数を定義します。
PHP_METHOD(example, hello){
zval *data, *obj;
obj = getThis();
data = zend_read_property(Z_OBJCE_P(obj), obj, "yourname",
strlen("yourname"), 1 TSRMLS_CC);
printf("hello, %s\n", data->value.str.val);
RETURN_TRUE;
}
プロパティ yourname を読み取り、表示すると言うことを行っています。
PHP5 からはカレントディレクトリにある共有ファイルを dl() 関数でロード出来ないようなので以下のようにして実行するとわざわざ extension_dir に置かなくて良いのでお手軽です。
php5 -d extension_dir=modules -d extension=example.so test.php
最初に設計した通りの実行結果になれば成功です。
今回のチュートリアルではクラスの基本的な部分を紹介しましたが、PHP のクラスにはコンストラクタ、デストラクタ、継承、などまだまだ機能がありますのでこれらを次回のテーマにするかもしれません。
klab_gijutsu2 at 10:17│Comments(2)│TrackBack(2)
トラックバックURL
この記事へのトラックバック
1. [PHP]PHP Extension を作ろう第3回 - クラスを作ろう [ Do You PHP はてな ] 2007年01月29日 15:44
第3回が公開されています。今日の勉強会のネタでしょうか。うーん。出たかった>勉強会 でも、宴会には出ます :-) 今回は PHP Extension でクラスを実装する方法を紹介します。 クラスと言えばオブジェクト指向によるプログラミングに欠かせないシステムであり、PHP にもも
2. PHP拡張でクラス作成 [ 眠る開発屋blog ] 2007年01月29日 22:29
PHP Extension を作ろう第3回 - クラスを作ろう
正直、PHP拡張でのクラス作成はよく分からなかったので、期待大。
...
この記事へのコメント
1. Posted by hamano 2007年01月29日 16:00
こちら第20回PHP勉強会で話そうと思っているネタです。
http://events.php.gr.jp/event.php/event_show/13
http://events.php.gr.jp/event.php/event_show/13
2. Posted by takano32 2011年02月16日 20:09
ZendEngine勉強会@東京 で紹介されていました!
http://atnd.org/events/11975
参考になる記事、ありがとうございます。
連載、第四回を楽しみにされている方も多いようです。
http://atnd.org/events/11975
参考になる記事、ありがとうございます。
連載、第四回を楽しみにされている方も多いようです。