Главная Статьи Написать
 
Начнём
Введение
Инсталяция
Конфигурирование
Безопасность
Справочник Языка
Базовый синтаксис
Типы
Переменные
Константы
Выражения
Операции
Структуры управления
Функции
Классы и Объекты
Ссылки. Разъяснение.
Возможности
Обработка Ошибок
Создание изображений и манипуляции с ними
HTTP-аутентификация в PHP
Куки
Обработка загрузки файлов
Использование удалённых файлов
Обслуживание соединений
Постоянные соединения с базами данных
Безопасный режим
Использование PHP из командной строки
Функции. Справочник.
Функции, специфические для Apache
Array-функции
Aspell-функции [не рекомендуются]
BCMath математические функции произвольной точности
Bzip2 Compression-функции
Calendar-функции
CCVS API-функции
Функции поддержки COM для Windows
Class/Object-функции
ClibPDF-функции
Crack-функции
CURL, Client URL Library-функции
Cybercash payment-функции
Crédit Mutuel CyberMUT-функции
Cyrus IMAP -функции администрирования
Функции типов символов
Функции абстрактного слоя БД (dbm-стиль)
Дата и Время
dBase-функции
DBM-функции
dbx-функции
DB++-функции
Direct IO-функции
Функции директорий
DOM XML-функции
.NET-функции
Обработка ошибок и логинг
FrontBase-функции
filePro-функции
Функции файловой системы
Forms Data Format-функции
FriBiDi-функции
FTP-функции
Функции работы с функциями
Gettext
GMP-функции
HTTP-функции
Hyperwave-функции
Hyperwave API-функции
ICAP-функции [не рекомендуются]
iconv-функции
Image-функции
IMAP, POP3 и NNTP-функции
Informix-функции
InterBase-функции
Ingres II-функции
IRC Gateway-функции
Java
LDAP-функции
Mail-функции
mailparse-функции
Mathematical-функции
Многобайтные строки
MCAL-функции
Mcrypt Encryption-функции
Mhash-функции
Mimetype-функции
Microsoft SQL Server-функции
Ming-функции для Flash
Прочие функции
mnoGoSearch-функции
mSQL-функции
MySQL-функции
Mohawk Software -функции обработчика сессии
muscat-функции
Network-функции
Ncurses -функции управления терминалом
Lotus Notes-функции
Unified ODBC-функции
Oracle 8-функции
OpenSSL-функции
Oracle-функции
Ovrimos SQL-функции
Управление выводом
Перегрузка свойств объектов и вызовов методов
PDF-функции
Verisign Payflow Pro-функции
PHP. Опции & Информация
POSIX-функции
PostgreSQL-функции
Управление процессом
Выполнение программы
Printer-функции
Pspell-функции
GNU Readline
GNU Recode-функции
Функции регулярных выражений (Perl-совместимые)
qtdom-функции
Функции регулярных выражений (POSIX расширенная)
Semaphore, Shared Memory и IPC-функции
SESAM database-функции
Обслуживание сессий
Shared Memory-функции
Shockwave Flash-функции
SNMP-функции
Socket-функции
String-функции
Sybase-функции
URL-функции
Функции переменных
vpopmail-функции
W32api-функции
WDDX-функции
XML parser-функции
XMLRPC-функции
XSLT-функции
YAZ-функции
YP/NIS-функции
Zip File-функции (доступ только для чтения)
Zlib Compression-функции
Расширение PHP 4.0
Обзор
Возможность расширения
Строение исходного кода
Система автоматического построения РНР
Создание расширений
Использование расширений
Решение проблем
Исходные Ресурсы. Обсуждение.
Приём аргументов
Создание переменных
Дублирование содержимого переменной: конструктор Copy
Возвращаемые значения
Печать информации
Startup и Shutdown-функции
Вызов пользовательских функций
Поддержка файлов инициализации
Что дальше?
Справочник: некоторые макросы конфигурации
Макросы API
FAQ: Frequently Asked Questions
Общая информация
Списки рассылки
Получение PHP
Вопросы о базах данных
Инсталяция
Проблемы построения
Использование PHP
PHP и HTML
PHP и COM
PHP и другие языки
Переход от PHP 2 к PHP 3
Переход от PHP 3 к PHP 4
Другие вопросы
Приложения
История PHP и смежных проектов
Переход от PHP 3 к PHP 4
Переход от PHP/FI 2 к PHP 3
Отладка PHP
Расширение PHP
Список псевдонимов функций
Список зарезервированных слов
Список типов ресурсов
Список лексем разборщика
Об этом учебнике




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-исключение