PHP 5.4におけるZend APIの変更点

16日目@yohgakiさんに続いて、2回目のPHP5.4 Advent Calendar 2011 エントリです。

今回はヘッダファイルの差分を見てPHP 5.3からPHP 5.4のZend APIにどのような変更があったのかを見てみましょう。バイトコードに対する処理が書かれているzend_vm_def.hとzend_vm_execute.hを除いた全差分はGistに貼り付けました

全体的には char * / void * と定義されていた引数が const char * / const void * になっている箇所が多く見られます。この変更はPHP 5.2から5.3にもありましたが、中身を書き換えないポインタはconst修飾するというセオリーがより徹底されており、地味ながら良い変更ですね。


トレイト関連のAPI追加 (zend.h, zend_API.h)

トレイトが導入されたことにより、トレイト関連のAPIが追加されているほか、zend_class構造体もトレイトをサポートするために大きな変更があります。 (詳細はあとで書く)


zvalを操作するマクロの追加 (zend.h)

マクロ ZVAL_COPY_VALUE(zval *z, zval *v)INIT_PZVAL_COPY(zval *z, zval *v) が追加されています。

前者はzvalの「値」を同じにするために、後者はzvalの参照カウントを1にし、他のzvalへの参照であるというフラグを0にします。

このような処理はPHP 5.3までは個別に書かれていたのですが、定型処理をマクロ化したことでZend Engine/PHP本体だけでなく変数を操作する拡張モジュールが書きやすくなるかもしれません。少なくとも「定型処理に名前を付ける」ことで意図が明確になり、読みやすさは格段に向上します。


カレンダーの締め切りの時間が迫ってきたので、いったんここまでで投稿します。朝までに追記しますので請うご期待。

明日はついにここいち兄さん登場です!