 |
XLVIII. 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.
Пример 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, которые
экспонируют большую часть своей функциональности через 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-исключение
|  |