1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-29 19:02:23 +02:00
Files
archived-doc-es/reference/java/reference.xml
2007-12-10 17:09:35 +00:00

240 lines
9.2 KiB
XML

<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.4 $ -->
<!-- EN-Revision: 1.12 Maintainer: javi Status: ready -->
<reference xml:id="ref.java" xmlns="http://docbook.org/ns/docbook">
<title>Integraci&oacute;n de Java y PHP</title>
<titleabbrev>Java</titleabbrev>
<partintro>
<section xml:id="java.intro">
&reftitle.intro;
<para>
Existen dos formas diferentes de integrar PHP y Java: en primer lugar,
<link linkend="java.servlet">se puede integrar PHP dentro de un entorno
de ejecuci&oacute;n de servlets de Java</link>, que en estos momentos es una soluci&oacute;n m&aacute;s estable y m&aacute;s eficiente.
La segunda opci&oacute;n es la de integrar Java dentro de PHP. La primera forma de integraci&oacute;n se realiza a traves de un m&oacute;dulo SAPI que actua como interfaz del servidor de servlets. La segunda forma se realiza mediante esta extensi&oacute;n de Java.
</para>
<para>
Esta extensi&oacute;n de Java proporciona de forma sencilla los medios necesarios para crear e invocar m&eacute;todos sobre objetos de Java desde PHP. La JVM se crea utilizando JNI y todo se ejecuta en un unico proceso.
</para>
&warn.experimental;
</section>
<section xml:id="java.requirements">
&reftitle.required;
<para>
Para utilizar esta extensi&oacute;n es necesario disponer de una
m&aacute;quina virtual Java (JVM) instalada en el sistema.
</para>
</section>
&reference.java.configure;
&reference.java.ini;
<section xml:id="java.resources">
&reftitle.resources;
&no.resource;
</section>
<section xml:id="java.constants">
&reftitle.constants;
&no.constants;
</section>
<section xml:id="java.examples">
&reftitle.examples;
<para>
<example>
<title>Ejemplo de Java</title>
<programlisting role="php">
<![CDATA[
<?php
// se obtiene la instancia de la clase de Java java.lang.System desde PHP
$system = new Java('java.lang.System');
// ejemplo de acceso a las propiedades de Java
print 'Version de Java='.$system->getProperty('java.version').' <br>';
print 'Desarrollador de la JVM=' .$system->getProperty('java.vendor').' <br>';
print 'Sistema Operativo='.$system->getProperty('os.name').' '.
$system->getProperty('os.version').' on '.
$system->getProperty('os.arch').' <br>';
// ejemplo de 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>Ejemplo de AWT</title>
<programlisting role="php">
<![CDATA[
<?php
// Este ejemplo solo puede ser ejecutado como CGI.
$frame = new Java('java.awt.Frame', 'PHP');
$button = new Java('java.awt.Button', 'Hola Mundo de Java!');
$frame->add('North', $button);
$frame->validate();
$frame->pack();
$frame->visible = True;
$thread = new Java('java.lang.Thread');
$thread->sleep(10000);
$frame->dispose();
?>
]]>
</programlisting>
</example>
Notas:
<itemizedlist>
<listitem>
<simpara>
<literal>new Java()</literal> crea una nueva instancia de una clase
solamente si existe un constructor adecuado. Si no se le pasan
par&aacute;metros, debe existir un constructor por defecto adecuado,
como por ejemplo en el caso de <literal>java.lang.System</literal> que
permite el acceso a la mayor&iacute;a de sus funcionalidade a trav&eacute;s de
metodos est&aacute;ticos.
</simpara>
</listitem>
<listitem>
<simpara>
Al acceder a los miembros de una instancia, en primer lugar se
buscar&aacute;n las propiedades del bean y en segundo lugar los
miembros publicos. En otras palabras, <literal>print $date.time</literal>
se intentar&aacute; resolver en primer lugar como <literal>$date.getTime()</literal>
y posteriormente como <literal>$date.time</literal>.
</simpara>
</listitem>
<listitem>
<simpara>
Tanto los miembros est&aacute;ticos como los miembros de una instancia de un
objeto pueden ser accedidos utilizando la misma sintaxis. Ademas, si el objeto
es de tipo <literal>java.lang.Class</literal>, entonces se puede acceder
a los miembros estaticos de la clase (tanto los atributos como los metodos).
</simpara>
</listitem>
<listitem>
<para>
Las excepciones que se lanzan durante la ejecuci&oacute;n se
transforman en avisos de tipo "warning" de PHP y en resultados de tipo &null;.
Los avisos de tipo "warning" se pueden eliminar a&ntilde;adiendo el prefijo
"@" a la llamada del metodo. Las siguientes funciones de la API se pueden
utilizar para obtener y borrar el ultimo error surgido:
<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>
La resoluci&oacute;n de la sobrecarga es uno de los problemas mas
dificiles de resolver dadas las grandes diferencias entre PHP y Java
en el tema del "tipado" de las variables. Esta extensi&oacute;n utiliza un
metodo simple pero muy efectivo para determinar cual es la mejor decisi&oacute;n
a tomar cuando se produce la sobrecarga.
</simpara>
<simpara>
Ademas, los nombres de los m&eacute;todos en PHP no distinguen entre
mayusculas y minusculas, por lo que se aumenta eln&uacute;mero de posibilidades
para elegir en las situaciones de sobrecarga.
</simpara>
<simpara>
Una vez seleccionado el m&eacute;todo, los par&aacute;metros se transforman
si es necesario, incluso con la posibilidad de perder datos (por ejemplo,
los n&uacute;meros de tipo "double" se transforman en tipo boolean) (Nota del traductor: esta conversion parece totalmente absurda, asi que puede tratarse de un fallo de la documentaci&oacute;n de la version original).
<!-- FIXME Why aren't java-doubles converted to PHP-floats? Is this
correct? -->
</simpara>
</listitem>
<listitem>
<simpara>
En PHP, las variables de tipo "array" y "hashtable" pueden ser utilizadas de
forma indistinta. En PHP, las hashtables solo pueden incluir en las
claves variables de tipo integer o string. Ademas, en Java los arrays
cuyas variables son de algun tipo primitivo, no pueden contener huecos.
Por ultimo, se debe recordar que este tipo de variables se pasan por valor,
por lo que pueden llegar a consumir una cantidad apreciable de memoria y de tiempo.
</simpara>
</listitem>
</itemizedlist>
</para>
</section>
<section xml:id="java.servlet">
<title>SAPI de los servlets Java</title>
<para>
Basandose en el mismo mecanismo que la extension de Java de PHP, la SAPI de
los servlets Java permite ejecutar PHP como un servlet de Java. La ventaja
m&aacute;s significativa de esta forma de actuar es que se aprovechan las
caracter&iacute;sticas de "pooling" y de reutilizaci&oacute;n de recursos
implementadas por la mayor&iacute;a de servidores que permiten ejecutar servlets.
El archivo <filename>php4/sapi/README</filename> contiene las instrucciones necesarias
para compilar el modulo SAPI para los servlets Java.
Notas:
<itemizedlist>
<listitem>
<simpara>
Aunque, en principio, este c&oacute;digo podr&iacute;a ser ejecutado en cualquier
servidor que permita la ejecuci&oacute;n de servlets, solo se ha probado en
el servidor Jakarta/Tomcat desarrollado por la fundaci&oacute;n Apache. Por
ese motivo, cualquier informaci&oacute;n sobre la forma de ejecutarlo en
otros servidores, los errores encontrados, las soluciones planteadas,
etc...sera una informaci&oacute;n muy apreciada y que animamos a que los
desarrolladores envien a los responsables del desarrollo del proyecto
PHP.
</simpara>
</listitem>
<listitem>
<simpara>
Se pueden producir conflictos entre PHP y SAPI con respecto al
directorio de trabajo. Mientras PHP se est&aacute; ejecutando, el servidor de
servlets no podr&aacute; cargar ninguna clase que se encuentre en el
CLASSPATH si su ruta se especifica de forma relativa y tampoco podr&aacute;
encontrar el directorio de trabajo utilizado para las tareas de
administraci&oacute;n y compilaci&oacute;n de JSP.
</simpara>
</listitem>
</itemizedlist>
</para>
</section>
</partintro>
&reference.java.entities.functions;
</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:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->