Функции PHP / Java
Есть два способа связать PHP и Java: вы можете либо интегрировать PHP в
среду Java Servlet, что является более стабильным и эффективным решением, либо
интегрировать поддержку Java в PHP.
Первый предоставляется SAPI-модулем, который является интерфейсом с
Servlet-сервером, второй - РНР-расширением Java.
PHP 4 ext/java предоставляет простые и эффективные средства для создания и
вызова методов Java-объектов из PHP. JVM создаётся с использованием JNI,
и всё запускается in-process. Свтроенные инструкции для ext/java можно найти в файле php4/ext/java/README.
Внимание |
Это расширение является ЭКСПЕРИМЕНТАЛЬНЫМ. Поведение этого расширения,
включая имена его функций и относящуюся к нему документацию, может
измениться в последующих версиях PHP без уведомления. Используйте
это расширение на свой страх и риск. |
У Вас должна быть установлена виртуальная машина Java (Java VM).
Это расширение PECL не поставляется вместе с PHP.
В PHP 4 исходные файлы этого расширения PECL могут быть найдены в директории ext/ внутри исходных файлов
PHP или по ссылке PECL выше.
In order to use these functions you must compile PHP with Java support by
using the --with-java[=DIR] where DIR
points to the base install directory of your JDK. This extension can only
be built as a shared extension. Additional build extensions can be found
in php-src/ext/java/README.
Пользователям Windows необходимо включить php_java.dll в php.ini для использования этих функций.
В PHP 4 этот DLL находится в
директории extensions/ внутри директории бинарного
дистрибутива PHP для Windows.
Вы можете скачать DLL этого
расширения PECL со страницы
PHP Downloads или
http://snaps.php.net/.
Примечание: В дополнение к включению данного модуля, для Windows, работающей с PHP версии <=
4.0.6, Вам необходим jvm.dll в системной директории. Но никакие DLL не требуются для PHP версий > 4.0.6.
Пример 1. Пример работы с Java
<?php
// get instance of Java class java.lang.System in PHP
$system = new Java('java.lang.System');
// demonstrate property access
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 example
$formatter = new Java('java.text.SimpleDateFormat',
"EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");
echo $formatter->format(new Java('java.util.Date'));
?> |
|
Пример 2. Пример AWT
<?php
// This example is only intended to be run as a 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, которые экспонируют большую часть своей функциональности через static-методы.
При доступе к члену экземпляра сначала ищутся свойства "боба"/bean
(компонента), а затем - public-поля. Иначе говоря, print $date.time сначала пытается разрешиться как
$date.getTime(), а затем как $date.time.
Доступ к статическим членам и членам экземпляра может быть выполнен на
объекте с тем же самым синтаксисом. Кроме того, если java-объект имеет тип java.lang.Class, то можно получить доступ также к static-членам класса
(полям и методам). Возникающие исключения выдаю предупреждения PHP и NULL-результаты. Появление предупреждений можно подавить с помощью префиксирования
вызовов методов знаком "@". Следующие API можно использовать для запрашивания и восстановления последней ошибки:
Решение проблемы перегрузки в общем является большой проблемой из-за
различий в типах между двумя языками. PHP-расширение Java реализует простую,
но довольно эффективную метрику для определения того, какая перегрузка подходит более всего.
Кроме того, имена методов в PHP не чувствительны к регистру символов,
потенциально увеличивая количество перегрузок, из которых делается выборка.
После выбора метода выполняется если необходимо, приведение параметров,
возможно, с потерей данных (пример: числа двойной точности с плавающей точкой будут конвертированы в boolean).
По традиции в PHP массивы и хэш-таблицы могут взаимозаменяться. Обратите
внимание, что хэш-таблицы в PHP могут индексироваться только целыми числами
или строками, и что массивы примитивных типов Java не могут быть рассеяны/sparse.
Также заметьте, что эти конструкции передаются по значению, поэтому могут быть затратными в плане памяти и времени.
sapi/servlet построен на механизме, определённом расширением ext/java, что
обеспечивает запуск всего процессора PHP как сервлета. Основным преимуществом
этого способа, в отличие от PHP, является то, что web-серверы, поддерживающие
сервлеты, обычно очень заботятся о пулах и повторном использовании JVM.
Инструкции построения для модуля Servlet SAPI можно найти в файле php4/sapi/README.
Примечания: Поскольку предполагается, что этот код должен иметь возможность запуска
на любой машине сервлетов, он был протестирован только на Apache'вском Jakarta/tomcat. Мы
приветствуем также сообщения о дефектах, успехах и/или патчах, необходимых для работы этого кода на других машинах.
PHP имеет привычку менять рабочую директорию. sapi/servlet может вернуть
в прежнюю, но, пока PHP работает, машина сервлетов не сможет загрузить
какие-либо классы из CLASSPATH, которые специфицированы с использованием
относительного синтаксиса директорий, или найти рабочую директорию,
используемую для задач администрирования и компиляции JSP.
- Содержание
- java_last_exception_clear - очищает последнее Java-исключение
- java_last_exception_get - получает последнее Java-исключение
|