LoginSignup
0

More than 5 years have passed since last update.

HaxeでPHPのNativeArrayを試す

Posted at

HaxeにはPHPの配列を直接利用するためにphp.NativeArrayという型があります。
php.NativeArrayはどのように利用して、どのようなコードを出力するのでしょうか?

HaxeのArrayType

通常、Haxeの中で定義した配列はトランスパイル後にHaxeが独自に定義する配列型でラップされた配列となります。

Haxeでの配列
[1,2,3,4,5];
トランスパイル後(PHP)の配列
\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の中ではキーにIntStringが混在して使え、またセットする型は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の型システムを利用しか開発が行えそうですね!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0