PHPのExtensionを作る時に、モヤっとするところ。
$obj->type = 123;
上のPHPコードをExtensionにすると、下のC言語のコードになります。
zend_update_property_long(Z_OBJCE_P(obj), obj, "type", sizeof("type")-1, 123);
モヤッとするのは"type"
を二回書かなければならないところです。
ですが、最近になってZEND_STRL
マクロを発見しました。
このマクロを使うと、
zend_update_property_long(Z_OBJCE_P(obj), obj, ZEND_STRL("type"), 123);
となり、同じことを2度書かなくてよくなります。
この辺のマクロの定義はZend/zend_portability.hの中にされています。
#define ZEND_STRL(str) (str), (sizeof(str)-1) #define ZEND_STRS(str) (str), (sizeof(str))
確かにマクロでできるよね~、マクロってすごいね~、という感じですが、C言語力が低い私は今まで律儀に2度書いてました。
もうひとつモヤッとするのは参照カウントです。
zend_update_property()
― オブジェクトにzvalを追加するadd_assoc_zval()
― 配列にzvalを追加する
上の2つはある意味で似ている機能ですが、前者ではzvalの参照カウントは上がり、後者だと上がらないという違いがあり、この辺を間違うとメモリリークや解放済みメモリの参照のようなバグになります。
Extension開発(PHP7以降)でつらいのは、上のようなものを含めて情報(特にリファレンス的に使えるもの)が少ないことです。(Extensionではなく)PHP本体の方はドキュメントが充実しているので、それと比べると雲泥の差があります。まあ、そもそもの話として「PHPのソースコードをサクサク読めるような人以外は、Extensionを作らない方が良い」というのはあるかもしれませんが、私のようなたまにしかExtensionをいじらない人にとっては割と難儀するところです。
参考:Extension開発をするにあたり有用なサイト(PHP7)を挙げておきます。
PHP Extension 開発入門(Michihide Hotta氏)
C言語で書くのはヒリヒリする感じがして好きなので、これからも精進しようと思います。