XLVIII. Java

Es gibt zwei Wege, um die Welten von Java und PHP zu verbinden. Einerseits besteht die Möglichkeit PHP in eine Java Servlet Umgebung zu integrieren, andererseits kann man mit der Java Extension aus PHP heraus auf Java Klassen zugreifen. Die erste der beiden genannten Möglichkeit ist wesentlich stabiler und performanter als die zweitgenannte Lösung.

Die Java Erweiterung für PHP nutzt das Object Overloading von PHP 4 um auf Java Klassen zuzugreifen. Die Java Virtual Machine (JVM) wird hierbei über das Java Native Interface (JNI) erzeugt. Eine detaillierte Installationsbeschreibung entnehmen Sie bitte der Datei php4/ext/java/README.

Beispiel 1. Zugriff auf Java Klassen aus PHP heraus

<?php
  // In PHP Instanz der Java Klasse java.lang.System erzeugen
  $system = new Java('java.lang.System');

  // Zugriff auf die Objekteigenschaften
  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 Beispiel
  $formatter = new Java('java.text.SimpleDateFormat',
                        "EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");

  print $formatter->format(new Java('java.util.Date'));
?>

Beispiel 2. Zugriff auf Java AWT aus PHP heraus

<?php
  // Dieses Beispiel kann nur als CGI ausgeführt werden.

  $frame  = new Java('java.awt.Frame', 'PHP');
  $button = new Java('java.awt.Button', 'Hallo Java Welt!');

  $frame->add('North', $button);
  $frame->validate();
  $frame->pack();
  $frame->visible = True;

  $thread = new Java('java.lang.Thread');
  $thread->sleep(10000);

  $frame->dispose();
?>
Notes:

  • new Java() erzeugt eine Instanz der angegebenen Java Klasse, falls ein geeigneter Konstruktur gefunden wird. Für den Zugriff auf Klassen mit statischen Methoden benötigt man keinen Parameter.

  • Beim Zugriff auf Mitglieder (Members) einer Instanz wird zunächst nach Bean Eigenschaften gesucht, danach erst nach öffentlichen (public) Eigenschaften. Mit anderen Worten: Es wird zuerst versucht werden, zum Beispiel print $date.time als $date.getTime() zu interpretieren, danach erst wird $date.time versucht werden.

  • Der Zugriff auf statische und Instanzeigenschaften erfolgt mit der selben Syntax.

  • Das Auslösen einer Java Exception resultiert in einer PHP Warnung und einem NULL Ergebnis. Folgende Funktionen ermöglichen den Zugriff auf die eigentlichen Exceptions:

  • Traditionell können Arrays und Hashes in PHP weitestgehend als gleichwertig angesehen werden. Beim Austausch dieser Datentypen zwischen PHP und Java ist zu beachten, dass Hashes in PHP nur mit Integer- und Stringwerten indiziert werden können und Arrays von primitiven Datentypen in Java nicht dünn besetzt sein dürfen. Ferner ist zu beachten, dass diese Datenstrukturen by-Value übergeben werden, was ungünstig in Bezug auf Speicher- und Zeitbedarf sein kann.

Das PHP 4 Servlet SAPI Modul baut auf dem von der Java Extension zur Verfügung gestellten Mechanismus auf, allerdings wird der PHP Prozessor hierbei von einer Servlet Engine, wie zum Beispiel Apache Jakarta / Tomcat, ausgeführt. Dies führt zu einer wesentlich höheren Stabilität und besserer Performance als der umgekehrte Weg, wie in die Java Extension an sich anbietet. Dies kommt daher, dass die Servlet Engine sich um das Pooling und die Wiederverwendung von Java Virtual Machines (JVMs) kümmert. Eine detaillierte Anleitung zur Integration von PHP in eine Servlet Engine entnehmen Sie bitte der Datei php4/sapi/README. Bemerkungen:

  • Das Servlet SAPI Modul sollte zwar auf jeder Java Servlet Engine funktionieren, wurde aber bislang nur in Verbindung mit Apache Jakarta/Tomcat getestet. Meldungen von Problem - aber auch von Erfolgserlebnissen - bei der Verendung mit anderen Servlet Engines werden dankbar aufgenommen.

  • PHP hat die Angewohnheit das aktuelle Arbeitsverzeichnis (CWD) zu ändern. sapi/servlet wird versuchen, den alten Zustand wieder herzustellen. Während PHP läuft kann es sein, dass die Servlet Engine kann Klassen aus dem CLASSPATH finden kann, die über relative Pfade angesprochen werden.

Inhaltsverzeichnis
java_last_exception_clear -- Letzte Java Exception freigeben
java_last_exception_get -- Letzte Java Exception holen