JPHPを使ってみた

はじめに

JavaVM上で動く言語は数ありますが(JRubyJython)、PHP版もあったんですね。
ということで、触りだけやってみました。

れっつとらいチュートリアル

チュートリアル用のファイルは公式WikiGithubから入手できます。
jphp-get-started.zipをダウンロードして解凍します。

解凍したディレクトリの中は次のような構成になっていると思います。

$ tree
.
├── build.gradle
├── debug.conf
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── src
    ├── Bootstrap.php
    └── JPHP-INF
        ├── .bootstrap.php
        └── launcher.conf

gradlewに実行権限付与

まずはgradlewに実行権限をつけてあげます。
gradlewはgradle等をインストールしていない環境であっても、 使えるようによしなにインストール等を行ってくれる親切な子です。

$ chmod +x gradlew

「こんにちは世界」

やっぱり最初はみんな大好き「Hello World」を出してみましょう。
と言ってもやることは簡単./gradlew runこれだけです。
チュートリアルではもろもろの準備は既に済ませてくれています。

$ ./gradlew run
Downloading https://services.gradle.org/distributions/gradle-2.4-bin.zip
...
Download https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.11/slf4j-api-1.7.11.jar
Hello World!
BUILD SUCCESSFUL

Total time: 7 mins 14.523 secs

初回起動はパッケージインストールに少々時間がかかりますが、 無事世界に挨拶出来ました。

ざっくりの動き

build.gradle

JavaAndroidではすっかりお馴染みのgradleさん。

...
dependencies {
    compile 'org.develnext.jphp:jphp-core:0.8.+' // include jphp with runtime and compiler
    ...
}

run {
    mainClassName = 'php.runtime.launcher.Launcher'
    jvmArgs += ["-Dfile.encoding=UTF-8"]
}

mainClassNameで基底のランチャークラスを指定しています。
(この他にもStandaloneLauncherというのがいます。)

.bootstrap.php

ランチャークラスはまずsrc/JPHP-INF/.bootstrap.phpが実行されます。

<?php

Bootstrap::run();

中身はこのようになっており、Bootstrapクラスのクラス関数が呼ばれているようです。

クラスファイル

デフォルトの設定では、phpのクラス群はsrcディレクトリ以下に設置していきます。
build.gradle内にファイル群をどこに置くのか設定しており、以下のように書かれているためです。

sourceSets {
    main.resources.srcDirs = ['src']
}

こちらで設定したソース以下のファイルは自動的にclasspathに追加され、利用することができます。
(namespaceは設定してあげる必要はあります)
上記を変更することで、任意の場所に変更できますが、特に問題も出ないと思いますのでそのままでも良いと思います。

先ほど出てきたBootstrapクラス(Bootstrap.php)もsrcディレクトリの直下に設置されているため、
すぐに使うことができたわけですね。

その他、ディレクトリを掘ってクラスを起きたい場合は、以下のようにすることで普通に使えます。
例:src/TestDir/Test.php(もうここはPHPですね)

<?php
namespace TestDir;

class Test
{
    static function run()
    {
        echo "This is Test Class";
    }
}

先程も述べたとおり、これらのクラスは自動でclasspathに追加され、JavaVM上で動くコードに変換されます。
ですので、利用する際には、例えば.bootstrap.phpを以下のように行を追加するだけです。

<?php
use TestDir\A; 

Bootstrap::run();
A::run(); #useを使うことも
TestDir\B::run(); #直接classpath形式で指定することもモチロン可能

配布物をつくる

JPHPはJavaVM上で動くものを作るので、
配布物として生成されるものはやっぱりjarになります。
これを作るのにもgradleを利用します。

$ ./gradlew distZip
$ # または
$ ./gradlew distTar

生成物はbuild/distributions/以下にzipまたはtarとして出力されます。
中にはbinlibディレクトリが作られており、 binディレクトリ以下にあるスクリプトを実行することで、 生成物の実行を行うことができます。

他に出来ること

他にも、JPHPではWebサーバを立てる、GUIを扱う(Swing)、マルチスレッド、Androidアプリ開発などなど、 いろいろと出来るようです。
しかし、未だ対応できていない標準関数もあるようですので、そこには注意が必要そうですね。

おわりに

最近ではある言語を別の言語に変換して生成物を動かすことができる組み合わせが増えてきて、 ますます言語間の垣根がじんわり薄くなってきたように感じます。
便利になることはいいこと。良い開発ライフを満喫していきたいものですね。