PHPとJavaの連携をとして考えられる手段は2種類あります。PHPをJavaサーブ
レット環境に統合する方法とJavaサポートをPHPに統合する方法です。前者の
方がより安定で効率的な手法です。前者は、サーブレットサーバへのインター
フェイスとしてSAPIモジュールにより提供され、後者は、Java拡張モジュール
として提供されます。
Java拡張モジュールは、PHPからJavaオブジェクトのメソッドを生成し、
コールする簡単で効率的な手段を提供します。このJVMはJNIを用いて作
成され、全てはこのプロセスで動作します。
| 警告 |
このモジュールは、
実験的なものです。これは、これらの関数の動作、関
数名は、このドキュメントに書かれて事項と同様に告知なく将来的なPHPのリ
リースで変更される可能性があります。注意を喚起するとともに、このモジュー
ルは使用者のリスクで使用して下さい。 |
この拡張モジュールを使用するには、使用するマシンにJava VMがインス
トールされていることが必要です。
この拡張モジュールの構築手順は、
php4/ext/java/READMEにあります。
Win32ユーザへの注意:
この拡張モジュールを有効にするには、PHP/Win32バイナリパッケージの
DLLフォルダからjvm.dllを使用するWindowsマシン
のSYSTEM32フォルダ(例:C:\WINNT\SYSTEM32または C:\WINDOWS\SYSTEM32)
にコピーする必要があります。
これらの関数の動作は、php.iniの設定により変化します。
表 1. Java設定オプション
| 名前 | デフォルト | 変更の可否 |
|---|
| java.class.path | NULL | PHP_INI_ALL |
| java.home | NULL | PHP_INI_ALL |
| java.library.path | NULL | PHP_INI_ALL |
| java.library | JAVALIB | PHP_INI_ALL |
PHP_INI_* 定数の詳細と定義については、
ini_set()を参照して下さい。
この拡張モジュールはリソース型を全く定義しません。
例 1. Javaの例
<?php // Java クラス java.lang.System のインスタンスをPHPに作成する $system = new Java('java.lang.System');
// プロパティへのアクセスのデモ print 'Java version='.$system->getProperty('java.version').' <br>'; print 'Java vendor=' .$system->getProperty('java.vendor').' <br>'; print 'OS='.$system->getProperty('os.name').' '. $system->getProperty('os.version').' on '. $system->getProperty('os.arch').' <br>';
// java.util.Dateの例 $formatter = new Java('java.text.SimpleDateFormat', "EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");
print $formatter->format(new Java('java.util.Date')); ?>
|
|
例 2. AWTの例
<?php // この例は、CGIとして実行されることのみを考慮しています。
$frame = new Java('java.awt.Frame', 'PHP'); $button = new Java('java.awt.Button', 'Hello Java world!');
$frame->add('North', $button); $frame->validate(); $frame->pack(); $frame->visible = True;
$thread = new Java('java.lang.Thread'); $thread->sleep(10000);
$frame->dispose(); ?>
|
|
注意:
new Java() は、有効なコンストラクタがある場合、
クラスのインスタンスを生成します。引数が指定されない場合には、
デフォルトのコンストラクタにより
java.lang.Systemのようなクラスにアクセスすると
良いでしょう。このクラスは、静的な手法でそのクラスの機能の多くを
公開しています。
あるインスタンスのメンバーにアクセスする際には、まずbeanプロパティ
が探されてから、次にpublicフィールドが探されます。言い換えると、
print $date.timeはまず
$date.getTime()と解釈され、続いて
$date.timeと解釈されます。
静的メンバおよびインスタンスメンバは共に同じ構文でアクセス可能です。
さらに、javaオブジェクトがjava.lang.Class型の場
合、このクラスの静的メンバ(フィールドとメソッド)にアクセス可能です。
例外が発生するとPHPの警告が出力され、結果はNULLとなります。警告は
"@"記号を付けてメソッドをコールすることに抑圧できます。以下のAPI
を直近のエラーを取得し、リセットするために使用することができます。
オーバーロードの解決は、二つの言語の間で型の違いがあるため一般には
困難な問題です。PHP のJava拡張機能は簡単ですが最も一致するオーバー
ロードを定義するかなり効率的な手段を使用しています。
加えて、PHPのメソッド名は大文字小文字を区別しないため、選択される
オーバーロードの数は増加する傾向があります。
メソッドが一度選択されると、パラメータの値は必要に応じて調整されま
す。このため、(倍精度実数が論理値に変換されるといった)データの劣化
が発生する可能性があります。
PHPでは伝統的に配列とハッシュテーブルは相互に完全に可換でした。PHPの
ハッシュテーブルは整数または配列の添字のみを使用できることに注意して
下さい。また、Javaのprimitive型の配列は疎とすることができないことに
も注意して下さい。これらの構造は値で渡されるため、メモリと時間の消
費量が大きくする可能性があります。
Java Servlet SAPIは、PHPプロセッサ全体をサーブレットとして実行す
るためにJava拡張モジュールにより定義された機構の上に構築されています。
この形態のPHPの側からこの実装が基本的に優れている点は、サーブレットを
サポートするWebサーバが通常JVMをプールし、再利用することに注力している
ことです。このサーブレットSAPIモジュールの構築手順は、
php4/sapi/README にあります。
注意:
このコードは、全てのサーブレットエンジンで実行可能であるように作成
されていますが、現在ApacheのJakarta/tomcatでしかテストされていませ
ん。他のエンジンでこのコードを実行する際に必要なパッチ、バグレポー
ト、成功事例等をお知らせ下さい。
PHP は、動作ディレクトリを変更する特徴があります。sapi/サーブレット
はもとに戻そうとしますが、PHPが実行されている間、サーブレットエンジ
ンはCLASSPATHい相対ディレクトリにより指定されている全てのクラスをロ
ードできないか、管理用およびJSPコンパイル用に使用されている作業ディ
レクトリを見つけることができなくなる可能性があります。