今回の記事では GitHub における php/php-src の commit c5d10ddda394b573dfaea1380285e1dd5f3c0d50 を前提としている.
前回に引き続き zval 構造体について調べる.
今回は PHP におけるデータ型について調べて行きたい.
./Zend/zend.h を適当に眺めていると, 以下のような定数があった.
恐らく PHP の基本的なデータ型に対応していると思われる.
PHP 5.4 なので callable もある.
CONSTANT_ARRAY というのは何だろう.
とりあえずは IS_ARRAY がどのように使われているか調べてみることにする.
git grep するとたくさん出てくるので, 検索範囲を絞ってみることにする.
PHP の標準関数の中で, zval や IS_ARRAY がどのように使われてみるか調べてみよう.
標準関数は ./ext/standard ディレクトリ内で定義されている.
参考: PHPソースコードリーディング入門(とっかかり編) - id:anatooのブログ
./ext/standard/array.c の中を探していると, 以下のような関数が見つかった.
これは PHP 標準の count() 関数の内部で呼ばれている関数である.
if (Z_TYPE_P(array) == IS_ARRAY) という記述から, Z_TYPE_P は zval のポインタを渡してその型を調べるためのマクロだと思われる.
Z_TYPE_P は ./Zend/zend_operators.h で定義されていた.
Z_TYPE_P が zval のポインタから型を調べるためのマクロで, その内部では zval の値から型を調べる Z_TYPE マクロが呼ばれている.
そしてこの Z_TYPE マクロは zval の type メンバを読み出してだけである.
というわけで, 前回の記事と総合して, zval の type メンバは PHP におけるデータ型を保持している, ということがわかった.
続く?