zts環境のpecl-genでclassを作る(続)
zts環境のpecl-genで、XMLから作成されたコードがビルドできない問題の続きです。ゴソゴソいじりつつ、できたコードを適当に改変することでスタブ的なものは動作するようになりました。
ありがとうございました > id:i_ogi "Twitterでのアドバイス"
ただ、XML => source の部分すらちゃんと理解しきっているわけではないので、効率は悪いです。本当は、適切なXMLを記述することで、一発ビルドできる様になるとといいなぁ。
XMLで作った定義は、以下のようにシンプルなものです。
-- xmlの一部 -- <class name="hoge"> <property name="name" type="string" access="public" value="HOGE_PROPERTY"/> <function name="check"> <proto>int check()</proto> <code><?data php_printf("HOGE%s", PHP_EOL); RETURN_TRUE; ?></code> </function> </class>
make時のエラー等を見ると、どうも class_init_hoge() がうまくないようです。
まず、引数に TSRMLS_DC がない。また、zend_register_internal_class() に引数が足りない。
で、引数にTSRMLS_DCをつけてたのですが、どうもうまくない感じです。また、zend_register_internal_class()の引数を変更しても、これはこれでうまくない感じです。どうやら、class_init_hoge()をうまく作れていない模様です。
しかたないので、今回はこの関数を使わずに、PHP_MINIT_FUNCTION() に直接コードを記述して逃げてみました。
というわけで、phpizeで作成されたコードを下記のように改変しました。
1. static void class_init_hoge(void)を変更 (hogeはクラス名) - 中身を全部、PHP_MINIT_FUNCTION() に移動 2. 中身を移行してきたPHP_MINIT_FUNCTION()を変更 - クラス登録(zend_register_internal_class()の引数を修正 - (&ce) => (&ce TSRMLS_CC) - プロパティ宣言(zend_declare_property_string(...)の第五引数の一部が 誤っているので修正 - TSRMLS_DC => TSRMLS_CC (呼び出し側なので)
うまくいった感じではあるので、ちょっとおためし。
nemo@dev:~/work/PECL/test/md_tq3$ php -dextension=md_tq3.so -r '$hoge = new hoge(); printf("name[%s]\n", $hoge->name); $hoge->check(); $fuga = new hoge(); $fuga->name = "nemoto"; printf("name[%s]\n", $fuga->name); printf("name[%s]\n", $hoge->name);' name[HOGE_PROPERTY] HOGE name[nemoto] name[HOGE_PROPERTY]
まぁ、とりあえずはこんな所かな。。