PHPのExtensionのTips ― ZEND_STRLマクロ

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)を挙げておきます。

Writing PHP Extensions(Zend社)

PHP Internals Book(PHPの開発者)

PHP Extension 開発入門(Michihide Hotta氏)

C言語で書くのはヒリヒリする感じがして好きなので、これからも精進しようと思います。