Java
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.
Пример 2. AWT
|
Примечания:
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-исключение