1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
|
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.4 $ -->
<reference id="ref.java">
<title>Java</title>
<titleabbrev>Intégration de Java</titleabbrev>
<partintro>
<para>
Il y a deux moyens de connecter PHP et Java : soit en intégrant
Java directement dans PHP, ce qui est la solution la plus stable et
la plus efficace, ou en intégrant PHP dans un environnement de
Servlet Java. La première solution est fournie par cette extension
Java, et la dernière par le module SAPI qui s'interface avec
un serveur de Servlet.
</para>
<para>
PHP 4 ext/java fournit un moyen simple mais efficace pour invoquer et
créer des objets Java, depuis PHP. Une machine virtuelle est
créée via JNI,
et le tout fonctionne avec des processus fils. Les instructions d'installation
pour cette extension sont sont disponibles dans le fichier :
<filename>php4/ext/java/README</filename>.
<example>
<title>Exemple avec Java</title>
<programlisting role="php">
<?php
// crée une instance de Java class java.lang.System en PHP
$system = new Java("java.lang.System");
// accède aux propriétés
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>";
// Exemple avec 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"));
?>
</programlisting>
</example>
<example>
<title>Exemple AWT</title>
<programlisting role="php">
<?php
// Cet exemple ne fonctionne qu'en mode CGI.
$frame = new Java("java.awt.Frame", "Zend");
$button = new Java("java.awt.Button", "Bonjour au monde Java!");
$frame->add("Nord", $button);
$frame->validate();
$frame->pack();
$frame->visible = true;
$thread = new Java("java.lang.Thread");
$thread->sleep(10000);
$frame->dispose();
?>
</programlisting>
</example>
Notes:
<itemizedlist>
<listitem>
<simpara>
<literal>new Java()</literal> crée une nouvelle instance d'une classe,
si un constructeur valable est disponible. Si aucun paramètre n'est passé,
et le constructeur par défaut est utile pour accéder à ces classes
telles que "java.lang.System", qui fournissent leur fonctionnalités via
des méthodes statiques.
</simpara>
</listitem>
<listitem>
<simpara>
Lors de l'accès aux membres d'une instance, PHP commencera par rechercher
les membres Bean, puis les champs publics. En d'autres termes,
"<literal>print $date.time</literal>" sera d'abord résolu par
"<literal>$date.getTime()</literal>", puis par "<literal>$date.time</literal>";
</simpara>
</listitem>
<listitem>
<simpara>
Les membres statiques et d'instance sont accessibles avec la même
syntaxe. De plus, si un objet est de type "<literal>java.lang.Class</literal>",
les membres statiques de la classe (champs et méthodes) sont accessibles.
</simpara>
</listitem>
<listitem>
<para>
Les exceptions sont transformées en alertes PHP, et résultat NULL.
Les alertes peuvent être supprimées en préfixant l'appel
par l'opérateur <literal>></literal>. Les fonctions suivantes
peuvent être utilisées pour lire et effacer la dernière
erreur remontée :
<itemizedlist>
<listitem><simpara><function>java_last_exception_get</function></simpara></listitem>
<listitem><simpara><function>java_last_exception_clear</function></simpara></listitem>
</itemizedlist>
</para>
</listitem>
<listitem>
<simpara>
Les surchargements de fonctions sont des problèmes épineux,
étant donné les différences de type de valeurs entre les deux
langages. L'extension Java de PHP utilise une métrique simple
mais efficace pour déterminer la meilleur fonction à utiliser.
</simpara>
<simpara>
De plus, les noms de méthodes ne sont pas sensibles à la casse en
PHP, ce qui augmente le nombre de conflits potentiels.
</simpara>
<simpara>
Une fois qu'une méthode est sélectionnée, les paramètres sont
transtypés, avec une perte d'information potentielle non négligeable
(par exemple, les nombres à virgules flottante en double précisions
seront convertis en booléen).
</simpara>
</listitem>
<listitem>
<simpara>
Traditionnellement en PHP, les tableaux et les tables de hashage peuvent
être interchangées, et fonctionnent de la même façon.
Notez que les tables de hashage de PHP ne peuvent être indexées
qu'avec des entiers ou des chaînes, et que le type primitif de
tableau de Java ne peut comporter de trous dans les index. Notez aussi
que les valeurs sont passées par
valeur, ce qui peut être coûteux en mémoire et en temps.
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
L'interface PHP4 sapi/servlet est construite sur un mécanisme défini
par l'extension Java, qui permet à PHP d'être exécuté
comme une servlet. L'avantage immédiat d'un point de vue PHP est que les
serveurs web qui supportent les servlets gèrent rigoureusement les
machines virtuelles. Les instructions d'installation du module Servlet SAPI
sont disponibles dans le fichier <filename>php4/sapi/README</filename>.
Notes:
<itemizedlist>
<listitem>
<simpara>
Bien que ce code soit prévu pour fonctionner sur n'importe quel
serveur à Servlet, il n'a été testé qu'avec le module Apache
Jakarta/tomcat (jusqu'à aujourd'hui). Les remontées de bugs, les
réussites et les patches nécessaires pour faire fonctionner ce code
sur d'autres serveurs sont fortement encouragés!
</simpara>
</listitem>
<listitem>
<simpara>
PHP a l'habitude de changer le dossier de travail. Le serveur SAPI/Servlet
le changera à nouveau, mais tant que PHP fonctionnera, le moteur de servlet
ne pourra pas charger de classes dans le CLASSPATH, si le dossier est
spécifié avec un chemin relatif, ou ne pourra pas trouver le dossier
d'administration et de compilation des tâches JSP.
</simpara>
</listitem>
</itemizedlist>
</para>
</partintro>
<refentry id="function.java-last-exception-clear">
<refnamediv>
<refname>java_last_exception_clear</refname>
<refpurpose>Efface la dernière exception Java</refpurpose>
</refnamediv>
<refsect1>
<title>Description</title>
<methodsynopsis>
<type>void</type><methodname>java_last_exception_clear</methodname>
<void/>
</methodsynopsis>
</refsect1>
</refentry>
<refentry id="function.java-last-exception-get">
<refnamediv>
<refname>java_last_exception_get</refname>
<refpurpose>Lit la dernière exception Java</refpurpose>
</refnamediv>
<refsect1>
<title>Description</title>
<methodsynopsis>
<type>exception</type><methodname>java_last_exception_get</methodname>
<void/>
</methodsynopsis>
<para>
L'exemple ci-dessous montre l'utilisation du gestionnaire d'exceptions
java :
<example>
<title>Gestionnaire d'exception Java</title>
<programlisting role="php">
<?php
$stack = new Java("java.util.Stack");
$stack->push(1);
// Cela doit marcher
$result = $stack->pop();
$ex = java_last_exception_get();
if (!$ex) print "$result\n";
// Cela doit échouer (le rapport d'erreurs est supprimé par >)
$result = @$stack->pop();
$ex = java_last_exception_get();
if ($ex) print $ex->toString();
// Efface la dernière exception
java_last_exception_clear();
?>
</programlisting>
</example>
</para>
</refsect1>
</refentry>
</reference>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
|