XLVII. 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
.