php_iovm-0.1.0: PHPとIoの連携を強化

php_iovm-0.1.0.tgz

  • ポインタ、intptr_t、longの大きさが異なる環境でも使えるようになった
  • IoからPHPの定数・変数・関数が利用できるようになった
  • IoからPHPの"echo"が利用できるようになった
  • IoStateクラスにメソッドを追加

IoからPHPの定数・変数・関数を使う

PHPオブジェクトのメソッドを介してアクセスします。

// 定数 $HOGE を取得
cHoge := PHP constant("HOGE")

// グローバル変数 $hoge を取得
gHoge := PHP global("hoge")

// ローカル変数 $hoge を取得
vHoge := PHP var("hoge")

// 関数 hoge を引数なしで呼び出す
rHoge0 := PHP call("hoge")

// 関数 hoge を引数つきで呼び出す
rHoge1 := PHP call("hoge", arg1, arg2)

// call_user_func_array() 相当のものを独自に定義
PHP call_array := method(func, args,
    PHP performWithArgList("call", args clone prepend(func))
)
rHoge2 := PHP call_array("hoge", list(arg1, arg2))

Ioでecho

Ioのwrite, writeln, print, println等のメソッドは標準出力に直接書き出しますが、PHPでは出力がバッファリングされてから標準出力 (またはSAPIの出力ストリーム) に書き出されるため、Ioの出力とPHPの出力が同期しないことがあります。
それを避けるためにPHPの出力ストリームに文字列を書き込むメソッドを用意しました。

// "hoge" を出力
PHP echo("hoge")

// 複数のメッセージにも対応
PHP echo("foo", "bar", "baz")

いちいち"PHP"と書くのが面倒な場合は"echo"だけで使えるようにしてみたり

Core echo := method(PHP performWithArgList("echo", call evalArgs))
Object echo := method(PHP echo(self))

Objectのメソッドをオーバーライドするのもありですね。

Object print = method(PHP echo(self))
Object println = method(PHP echo(self, PHP constant("PHP_EOL")))
Object write = method(PHP performWithArgList("echo", call evalArgs))
Object writeln = method(
    PHP performWithArgList("echo", call evalArgs)
    PHP echo(PHP constant("PHP_EOL"))
)

追加されたメソッド

インスタンスメソッドとしてdoFile()をサポートしたのと、一時的なIoStateを使うスタティックメソッドを追加しました。
staticDoXxxはちょっと試してみるのには便利ですが、IoStateの初期化コストがそれなりにかかるので繰り返し使うにはおすすめしません。

mixed IoState::doFile(string $path)

(インスタンスメソッド)
$pathで指定されたIoスクリプトを実行する。

mixed IoState::staticDoCString(string $code)

(スタティックメソッド)
$codeを実行する。IoStateは実行の度に初期化・開放される。

mixed IoState::staticDoFile(string $path)

(スタティックメソッド)
$pathで指定されたIoスクリプトを実行する。IoStateは実行の度に初期化・開放される。