HaxeにはPHPの配列を直接利用するためにphp.NativeArray
という型があります。
php.NativeArray
はどのように利用して、どのようなコードを出力するのでしょうか?
HaxeのArrayType
通常、Haxeの中で定義した配列はトランスパイル後にHaxeが独自に定義する配列型でラップされた配列となります。
[1,2,3,4,5];
\Array_hx::wrap([1,2,3,4,5,]);
Haxeが提供する型によって安全性は保たれるものの、キーの型が固定されてしまうことによるPHPとの連携が難しくなる問題や、常に配列用のインスタンスを生成することによるパフォーマンスの劣化が問題となっていました。
php.NativeArray
php.NativeArray
はその名の通り、PHPの純粋な配列をHaxeから利用することを可能にする型です。
以下のようにして利用することが出来ます。
var arr = new php.NativeArray();
arr[0] = "a";
arr["foo"] = 1;
これは下記のようにトランスパイルされます。
$this1 = [];
$this1[0] = "a";
$this1["foo"] = 1;
Haxeの中ではキーにInt
とString
が混在して使え、またセットする型はDynamicで定義されるのでどんな値でもセットすることが出来ることがわかります。
もっとも、Haxe側から型が混在するようなコードを書くことはありませんが、PHPのライブラリのExternを利用するときなどに大変役にたちますね。
php.NativeArray
はそのままではループ処理に利用することが出来ませんが、iterator
メソッドを呼ぶことでループ処理に利用できるようになります。
var arr = new php.NativeArray();
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
for (item in arr.iterator()) {
php.Lib.dump(item);
}
このコードはトランスパイル後下記のようになります。
$this1 = [];
$this1[0] = 1;
$this1[1] = 2;
$this1[2] = 3;
$_g_hasMore = reset($this1) !== false;
while ($_g_hasMore) {
unset($result);
$result = current($this1);
$_g_hasMore = next($this1) !== false;
var_dump($result);
}
ループ処理の部分のコードがちょっと直感的ではないのですが、すべてNativePHPのコードになっていることが分かります。
php.NativeArray
を通すことで、PHPの配列を利用することが出来るようになります。
HaxeのPHP7対応に加えてphp.NativeArray
を利用していけばパフォーマンスを保ちつつHaxeの型システムを利用しか開発が行えそうですね!