2007/1/7 日曜日

PHP拡張でクラス実装がよくわからん

Filed under: 技術メモ — dev0000 @ 13:38:18 このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをBuzzurl(バザール)に追加

PHPのmingモジュール等を参考に試行錯誤しているのだけども、PHP拡張でクラスを実装するのがよくわからん。
マニュアルもあまりないし。

準備

# ./ext_skel --extname=hello

で hello というモジュールを作ったとする。

実装

php_hello.h を変更。以下を追加。

C:
  1. PHP_METHOD(hello, __construct);
  2. PHP_METHOD(hello, taro);
  3. PHP_METHOD(hello, jiro);

hello.c を変更。
static int le_hello の後ろに以下を追加。

C:
  1. static zend_class_entry *hello_class_entry_ptr;
  2. static void destroy_Hello_resource(zend_rsrc_list_entry *resource TSRMLS_DC);

hello_functions はこのように修正。

C:
  1. zend_function_entry hello_functions[] = {
  2.     PHP_FE(confirm_hello_compiled,  NULL)
  3.     PHP_ME(hello,  __construct, NULL, 0)
  4.     PHP_ME(hello, taro, NULL, 0)
  5.     PHP_ME(hello, jiro, NULL, 0)
  6.     {NULL, NULL, NULL}
  7. };

初期化。

C:
  1. PHP_MINIT_FUNCTION(hello)
  2. {
  3.    zend_class_entry hello_class_entry;
  4.    INIT_CLASS_ENTRY(hello_class_entry, "Hello", hello_functions);
  5.    hello_class_entry_ptr =
  6.        zend_register_internal_class(&hello_class_entry TSRMLS_CC);
  7.    le_hello = zend_register_list_destructors_ex(
  8.        destroy_Hello_resource, NULL, "Hello", module_number );
  9.    return SUCCESS;
  10. }

実際に処理するところ。
コメントは愛嬌(なにそれ)。

C:
  1. PHP_METHOD(hello, __construct)
  2. {
  3.    int ret = zend_list_insert(NULL, le_hello);
  4.    object_init_ex(getThis(), hello_class_entry_ptr);
  5. //  add_property_resource(getThis(), "hello", ret);
  6. //  zend_list_addref(ret);
  7.  
  8.     printf("hello->_construct\n");
  9. }
  10. PHP_METHOD(hello, taro)
  11. {
  12.     printf("hello->taro\n");
  13. }
  14. PHP_METHOD(hello, jiro)
  15. {
  16.    printf("hello->jiro\n");
  17.  
  18. }
  19. static void destroy_Hello_resource(zend_rsrc_list_entry *resource TSRMLS_DC)
  20. {
  21.    printf("hello->destory\n");
  22. }

確認

テスト用のPHPコード。

PHP:
  1. <?php
  2. dl('hello.so');
  3. $obj = new Hello();
  4. $obj->taro();
  5. $obj->jiro();

結果。

# php test.php
hello->_construct
hello->taro
hello->jiro
hello->destory

結論

なんとなくわかったこと。

  • クラスメソッドはPHP_ME、PHP_METHODを使うらしい。
  • INIT_CLASS_ENTRY、zend_register_internal_classでクラスを定義。
  • zend_register_list_destructors_exでデストラクタ時の処理を設定できるらしい。

あまりよくわからないこと。

  • インスタンスをどうやって扱うのかよくわからん。
  • ってかほとんどよくわからん。

参考にしたページ

【PHPext】PHP拡張モジュールの作成
PHP Extension を作ろう第1回 - まずは Hello World

1件のコメント »

  1. PHP拡張でクラス作成…

    PHP Extension を作ろう第3回 – クラスを作ろう
    正直、PHP拡張でのクラス作成はよく分からなかったので、期待大。
    (more…)

    トラックバック by 眠る開発屋blog — 2007/1/29 月曜日 @ 13:55:46

この投稿へのコメントの RSS フィード。 TrackBack URL

コメントする

HTML convert time: 0.430 sec. Powered by WordPress ME