1
0
mirror of https://github.com/php/doc-ja.git synced 2026-03-30 11:02:18 +02:00
Files
archived-doc-ja/reference/java/reference.xml
TAKAGI Masahiro 42faf122ea sync with en.
git-svn-id: https://svn.php.net/repository/phpdoc/ja/trunk@197947 c90b9560-bf6c-de11-be94-00142212c4b1
2005-10-08 23:29:19 +00:00

234 lines
8.9 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision: 1.5 $ -->
<!-- EN-Revision: 1.13 Maintainer: hirokawa Status: ready -->
<!-- CREDITS: takagi -->
<!-- Purpose: remote.other -->
<!-- Membership: pecl, external -->
<!-- State: experimental -->
<reference id="ref.java">
<title>PHP / Java の連携</title>
<titleabbrev>Java</titleabbrev>
<partintro>
<section id="java.intro">
&reftitle.intro;
<para>
PHP と Java の連携をとして考えられる手段は 2 種類あります。
<link linkend="java.servlet">PHP を Java サーブレット環境に統合する方法
</link>と Java サポートを PHP に統合する方法です。前者のほうが
より安定で効率的な手法です。前者は、サーブレットサーバへのインターフェイス
として SAPI モジュールにより提供され、後者は Java 拡張モジュール
として提供されます。
</para>
<para>
Java 拡張モジュールは、PHP から Java オブジェクトのメソッドを生成し、
コールする簡単で効率的な手段を提供します。この JVM は JNI を用いて
作成され、全てはこのプロセスで動作します。
</para>
&warn.experimental;
</section>
<section id="java.requirements">
&reftitle.required;
<para>
この拡張モジュールを使用するには、使用するマシンに Java VM が
インストールされていることが必要です。
</para>
</section>
&reference.java.configure;
&reference.java.ini;
<section id="java.resources">
&reftitle.resources;
&no.resource;
</section>
<section id="java.constants">
&reftitle.constants;
&no.constants;
</section>
<section id="java.examples">
&reftitle.examples;
<para>
<example>
<title>Java の例</title>
<programlisting role="php">
<![CDATA[
<?php
// Java クラス java.lang.System のインスタンスをPHPに作成する
$system = new Java('java.lang.System');
// プロパティへのアクセスのデモ
echo 'Java version=' . $system->getProperty('java.version') . '<br />';
echo 'Java vendor=' . $system->getProperty('java.vendor') . '<br />';
echo '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");
echo $formatter->format(new Java('java.util.Date'));
?>
]]>
</programlisting>
</example>
<example>
<title>AWT の例</title>
<programlisting role="php">
<![CDATA[
<?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();
?>
]]>
</programlisting>
</example>
注意:
<itemizedlist>
<listitem>
<simpara>
<literal>new Java()</literal> は、有効なコンストラクタがある場合、
クラスのインスタンスを生成します。引数が指定されない場合には、
デフォルトのコンストラクタにより
<literal>java.lang.System</literal>のようなクラスにアクセスすると
良いでしょう。このクラスは、ほとんどの機能を静的なメソッドとして
公開しています。
</simpara>
</listitem>
<listitem>
<simpara>
あるインスタンスのメンバーにアクセスする際には、まず bean プロパティ
が探されてから、次に public フィールドが探されます。言い換えると、
<literal>print $date.time</literal> はまず
<literal>$date.getTime()</literal> と解釈され、続いて
<literal>$date.time</literal> と解釈されます。
</simpara>
</listitem>
<listitem>
<simpara>
静的メンバおよびインスタンスメンバは共に同じ構文でアクセス可能です。
さらに、java オブジェクトが <literal>java.lang.Class</literal> 型の
場合、このクラスの静的メンバ(フィールドとメソッド)にアクセス可能です。
</simpara>
</listitem>
<listitem>
<para>
例外が発生すると PHP の警告が出力され、結果は &null; となります。警告は
"@" 記号を付けてメソッドをコールすることに抑圧できます。
直近のエラーを取得し、リセットするために以下の API を使用することができます。
<itemizedlist>
<listitem><simpara><function>java_last_exception_get</function></simpara></listitem>
<listitem><simpara><function>java_last_exception_clear</function></simpara></listitem>
</itemizedlist>
</para>
</listitem>
<listitem>
<simpara>
オーバーロードの解決は、二つの言語の間で型の違いがあるため一般には
困難な問題です。PHP の Java 拡張機能は、どのオーバーロードが
最も一致するかを定義するための方法として、簡単ですがかなり
効率的なものを使用しています。
</simpara>
<simpara>
加えて、PHP のメソッド名は大文字小文字を区別しないため、選択される
オーバーロードの数は増加する傾向があります。
</simpara>
<simpara>
メソッドが一度選択されると、パラメータの値は必要に応じて調整されます。
このため、(倍精度実数が論理値に変換されるといった)データの劣化が
発生する可能性があります。
<!-- FIXME Why aren't java-doubles converted to PHP-floats? Is this
correct? -->
</simpara>
</listitem>
<listitem>
<simpara>
PHP では伝統的に配列とハッシュテーブルは相互に完全に可換でした。PHP の
ハッシュテーブルは整数または文字列の添字のみを使用できることに注意して
ください。また、Java の primitive 型の配列は疎とすることができないことに
も注意してください。これらの構造は値で渡されるため、メモリと時間の
消費量が大きくする可能性があります。
</simpara>
</listitem>
</itemizedlist>
</para>
</section>
<section id="java.servlet">
<title>Java Servlet SAPI</title>
<para>
Java Servlet SAPI は、PHP プロセッサ全体をサーブレットとして実行する
ために、Java 拡張モジュールにより定義された機構の上に構築されています。
PHP の側からみてこの実装が基本的に優れている点は、サーブレットを
サポートする Web サーバが通常 JVM をプールし、再利用することに注力している
ことです。このサーブレット SAPI モジュールの構築手順は、
<filename>php4/sapi/README</filename> にあります。
注意:
<itemizedlist>
<listitem>
<simpara>
このコードは、全てのサーブレットエンジンで実行可能であるように作成
されていますが、現在 Apache の Jakarta/tomcat でしかテストされていません。
他のエンジンでこのコードを実行する際に必要なパッチ、バグレポート、
成功事例等をお知らせください。
</simpara>
</listitem>
<listitem>
<simpara>
PHP は動作ディレクトリを変更する特徴があります。sapi/サーブレット
はもとに戻そうとしますが、PHP が実行されている間、サーブレットエンジンは
CLASSPATH に相対ディレクトリにより指定されている全てのクラスを
ロードできないか、管理用および JSP コンパイル用に使用されている
作業ディレクトリを見つけることができなくなる可能性があります。
</simpara>
</listitem>
</itemizedlist>
</para>
</section>
</partintro>
&reference.java.functions;
</reference>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->