<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >Integração PHP / Java</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="Manual do PHP" HREF="index.html"><LINK REL="UP" TITLE="Referência das Funções" HREF="funcref.html"><LINK REL="PREVIOUS" TITLE="ircg_whois" HREF="function.ircg-whois.html"><LINK REL="NEXT" TITLE="java_last_exception_clear" HREF="function.java-last-exception-clear.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="reference" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >Manual do PHP</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="function.ircg-whois.html" ACCESSKEY="P" >Anterior</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="function.java-last-exception-clear.html" ACCESSKEY="N" >Próxima</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="reference" ><A NAME="ref.java" ></A ><DIV CLASS="TITLEPAGE" ><H1 CLASS="title" >LXXII. Integração PHP / Java</H1 ><DIV CLASS="PARTINTRO" ><A NAME="AEN99493" ></A ><DIV CLASS="section" ><H1 CLASS="section" ><A NAME="java.intro" >Introdução</A ></H1 ><P > Existem duas maneira possíveis para integrar PHP com Java: você pode ou <A HREF="ref.java.html#java.servlet" >integrar o PHP a um ambiente Java Servlet </A >, que é a solução mais estável e eficiente, ou integrar suporte Java ao PHP. O primeiro está disponível por um módulo SAPI que faz a interface com o servidor Servlet, o outro faz isso por meio dessa extensão Java. </P ><P > A extensão Java prove meios simples e eficientes para criar e invocar métodos em objetos Java a partir do PHP. A JVM é criada usand JNI, e tudo roda no mesmo processo. </P ><DIV CLASS="warning" ><P ></P ><TABLE CLASS="warning" BORDER="1" WIDTH="100%" ><TR ><TD ALIGN="CENTER" ><B >Atenção</B ></TD ></TR ><TR ><TD ALIGN="LEFT" ><P >Este módulo é <SPAN CLASS="emphasis" ><I CLASS="emphasis" >EXPERIMENTAL</I ></SPAN >. Isso quer dizer que o comportamento neste módulo --- incluindo suas funções e seus nomes, e TUDO mais que está documentado sobre esse módulo --- poderá mudar em futuras versões do PHP, SEM QUALQUER NOTIFICAÇÃO. Esteja avisado, e use este módulo por sua própria conta e risco.</P ></TD ></TR ></TABLE ></DIV ></DIV ><DIV CLASS="section" ><H1 CLASS="section" ><A NAME="java.requirements" >Dependências</A ></H1 ><P > Você precisa de uma Java VM instalada na sua máquina para usar essa extensão. </P ></DIV ><DIV CLASS="section" ><H1 CLASS="section" ><A NAME="java.installation" >Instalação</A ></H1 ><P > Esta estensão <A HREF="http://pecl.php.net" TARGET="_top" >PECL</A > não vem compilada com o PHP. </P ><P > No PHP 4, os fontes desta estensão <ACRONYM CLASS="acronym" >PECL</ACRONYM > podem ser encontrados no diretório <TT CLASS="filename" >ext/</TT > ou dentro dos fontes do PHP ou no link <ACRONYM CLASS="acronym" >PECL</ACRONYM > acima. Para usar essas funções você deve compilar o PHP com suporte à Java usando a opção <CODE CLASS="option" >--with-java[=DIR]</CODE > onde DIR aponta para o diretório base de onde o JDK está instalado. Essa extensão só pode ser compilada como uma extensão compartilhada. Outras extensões podem ser encontradas em <TT CLASS="filename" >php-src/ext/java/README</TT >. </P ><P > Usuário do Windows devem habilitar <TT CLASS="filename" >php_java.dll</TT > no arquivo <TT CLASS="filename" >php.ini</TT > para usar essas funções. No PHP esta <ACRONYM CLASS="acronym" >DLL</ACRONYM > reside no diretório <TT CLASS="filename" >extensions/</TT > junto aos binários do PHP para Windows. Você pode baixar esta extensão <ACRONYM CLASS="acronym" >PECL</ACRONYM > <ACRONYM CLASS="acronym" >DLL</ACRONYM > a apartir de <A HREF="http://www.php.net/downloads.php" TARGET="_top" > downloads PHP</A > ou em <A HREF="http://snaps.php.net/" TARGET="_top" > http://snaps.php.net/</A >. </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > Para habilitar esse módulo em um ambiente Windows com o PHP <= 4.0.6, você deve colocar o arquivo <TT CLASS="filename" >jvm.dll</TT > no PATH do seu sistema. Nenhuma DLL adicional é necessária para versões do PHP > 4.0.6. </P ></BLOCKQUOTE ></DIV ></DIV ><DIV CLASS="section" ><H1 CLASS="section" ><A NAME="java.configuration" >Configurações em execução</A ></H1 ><P > O comportamento dessas funções podem ser modificado pelas configurações do <TT CLASS="filename" >php.ini</TT >. </P ><P > <DIV CLASS="table" ><A NAME="AEN99532" ></A ><P ><B >Tabela 1. Opções de Configuração da extensão de Java</B ></P ><TABLE BORDER="1" CLASS="CALSTABLE" ><COL><COL><COL><COL><THEAD ><TR ><TH >Nome</TH ><TH >Valor Padrão</TH ><TH >Alterável</TH ><TH >Changelog</TH ></TR ></THEAD ><TBODY ><TR ><TD >java.class.path</TD ><TD >NULL</TD ><TD >PHP_INI_ALL</TD ><TD > </TD ></TR ><TR ><TD >java.home</TD ><TD >NULL</TD ><TD >PHP_INI_ALL</TD ><TD > </TD ></TR ><TR ><TD >java.library.path</TD ><TD >NULL</TD ><TD >PHP_INI_ALL</TD ><TD > </TD ></TR ><TR ><TD >java.library</TD ><TD >JAVALIB</TD ><TD >PHP_INI_ALL</TD ><TD > </TD ></TR ></TBODY ></TABLE ></DIV > Para mais detalhes e definições das constantes PHP_INI_*, veja <A HREF="ini.html" >Apêndice H</A >. </P ></DIV ><DIV CLASS="section" ><H1 CLASS="section" ><A NAME="java.resources" >Tipos Resource</A ></H1 ><P >Esta extensão não possui nenhum tipo resource.</P ></DIV ><DIV CLASS="section" ><H1 CLASS="section" ><A NAME="java.constants" >Constantes pré-definidas</A ></H1 ><P >Esta extensão não possui nenhuma constante.</P ></DIV ><DIV CLASS="section" ><H1 CLASS="section" ><A NAME="java.examples" >Exemplos</A ></H1 ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN99572" ></A ><P ><B >Exemplo 1. Exemplo de Java</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#FF8000">// get instance of Java class java.lang.System in PHP<br /></font><font color="#0000BB">$system </font><font color="#007700">= new </font><font color="#0000BB">Java</font><font color="#007700">(</font><font color="#DD0000">'java.lang.System'</font><font color="#007700">);<br /><br /></font><font color="#FF8000">// demonstrate property access<br /></font><font color="#007700">echo </font><font color="#DD0000">'Java version=' </font><font color="#007700">. </font><font color="#0000BB">$system</font><font color="#007700">-></font><font color="#0000BB">getProperty</font><font color="#007700">(</font><font color="#DD0000">'java.version'</font><font color="#007700">) . </font><font color="#DD0000">'<br />'</font><font color="#007700">;<br />echo </font><font color="#DD0000">'Java vendor=' </font><font color="#007700">. </font><font color="#0000BB">$system</font><font color="#007700">-></font><font color="#0000BB">getProperty</font><font color="#007700">(</font><font color="#DD0000">'java.vendor'</font><font color="#007700">) . </font><font color="#DD0000">'<br />'</font><font color="#007700">;<br />echo </font><font color="#DD0000">'OS=' </font><font color="#007700">. </font><font color="#0000BB">$system</font><font color="#007700">-></font><font color="#0000BB">getProperty</font><font color="#007700">(</font><font color="#DD0000">'os.name'</font><font color="#007700">) . </font><font color="#DD0000">' ' </font><font color="#007700">.<br /> </font><font color="#0000BB">$system</font><font color="#007700">-></font><font color="#0000BB">getProperty</font><font color="#007700">(</font><font color="#DD0000">'os.version'</font><font color="#007700">) . </font><font color="#DD0000">' on ' </font><font color="#007700">.<br /> </font><font color="#0000BB">$system</font><font color="#007700">-></font><font color="#0000BB">getProperty</font><font color="#007700">(</font><font color="#DD0000">'os.arch'</font><font color="#007700">) . </font><font color="#DD0000">' <br />'</font><font color="#007700">;<br /><br /></font><font color="#FF8000">// java.util.Date example<br /></font><font color="#0000BB">$formatter </font><font color="#007700">= new </font><font color="#0000BB">Java</font><font color="#007700">(</font><font color="#DD0000">'java.text.SimpleDateFormat'</font><font color="#007700">,<br /> </font><font color="#DD0000">"EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz"</font><font color="#007700">);<br /><br />echo </font><font color="#0000BB">$formatter</font><font color="#007700">-></font><font color="#0000BB">format</font><font color="#007700">(new </font><font color="#0000BB">Java</font><font color="#007700">(</font><font color="#DD0000">'java.util.Date'</font><font color="#007700">));<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN99575" ></A ><P ><B >Exemplo 2. Exemplo de AWT</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#FF8000">// This example is only intended to be run as a CGI.<br /><br /></font><font color="#0000BB">$frame </font><font color="#007700">= new </font><font color="#0000BB">Java</font><font color="#007700">(</font><font color="#DD0000">'java.awt.Frame'</font><font color="#007700">, </font><font color="#DD0000">'PHP'</font><font color="#007700">);<br /></font><font color="#0000BB">$button </font><font color="#007700">= new </font><font color="#0000BB">Java</font><font color="#007700">(</font><font color="#DD0000">'java.awt.Button'</font><font color="#007700">, </font><font color="#DD0000">'Hello Java World!'</font><font color="#007700">);<br /><br /></font><font color="#0000BB">$frame</font><font color="#007700">-></font><font color="#0000BB">add</font><font color="#007700">(</font><font color="#DD0000">'North'</font><font color="#007700">, </font><font color="#0000BB">$button</font><font color="#007700">);<br /></font><font color="#0000BB">$frame</font><font color="#007700">-></font><font color="#0000BB">validate</font><font color="#007700">();<br /></font><font color="#0000BB">$frame</font><font color="#007700">-></font><font color="#0000BB">pack</font><font color="#007700">();<br /></font><font color="#0000BB">$frame</font><font color="#007700">-></font><font color="#0000BB">visible </font><font color="#007700">= </font><font color="#0000BB">True</font><font color="#007700">;<br /><br /></font><font color="#0000BB">$thread </font><font color="#007700">= new </font><font color="#0000BB">Java</font><font color="#007700">(</font><font color="#DD0000">'java.lang.Thread'</font><font color="#007700">);<br /></font><font color="#0000BB">$thread</font><font color="#007700">-></font><font color="#0000BB">sleep</font><font color="#007700">(</font><font color="#0000BB">10000</font><font color="#007700">);<br /><br /></font><font color="#0000BB">$frame</font><font color="#007700">-></font><font color="#0000BB">dispose</font><font color="#007700">();<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > Notes: <P ></P ><UL ><LI ><P > <TT CLASS="literal" >new Java()</TT > criará uma instância de uma classe se um construtor apropriado estiver disponível. Se nenhum parâmetros for passado e o construtor padrão for utilizável já que prove acesso à classes como <TT CLASS="literal" >java.lang.System</TT > que expõe a maior parte de suas funcionalidades através de métodos estáticos. </P ></LI ><LI ><P > Acessar um membro de uma instância primeiro procurará por uma propriedade bean, depois por campos públicos. Em outras palavras, <TT CLASS="literal" >print $date.time</TT > elel primeiro tentará trabalhar com <TT CLASS="literal" >$date.getTime()</TT >, depois com <TT CLASS="literal" >$date.time</TT >. </P ></LI ><LI ><P > Tanto membros estáticos como de instância podem ser acessados em um objeto com a mesma sintaxe. Além disso, se o objeto java é do tipo <TT CLASS="literal" >java.lang.Class</TT >, membros estáticos da classe (campos e métodos) podem ser acessados. </P ></LI ><LI ><P > Exceções disparadas resultam em avisos do PHP e em resultados <TT CLASS="constant" ><B >NULL</B ></TT >. Os avisos podem ser eliminados prefixando uma chamada de método com um sinal "@". As seguintes APIs podem ser usadas para obter e reniciar o último erro: <P ></P ><UL ><LI ><P ><A HREF="function.java-last-exception-get.html" ><B CLASS="function" >java_last_exception_get()</B ></A ></P ></LI ><LI ><P ><A HREF="function.java-last-exception-clear.html" ><B CLASS="function" >java_last_exception_clear()</B ></A ></P ></LI ></UL > </P ></LI ><LI ><P > Resolução de sobrecarga em geral é um problema complicado dada às diferenças nos tipos entre as duas linguagens. A extensão Java aplica uma métrica simples, mas relativamente eficaz, para determinar qual sobrecarga é a melhor. </P ><P > Além disso, nomes de métodos no PHP não são sensíveis ao caso, potencialmente aumentando o número de sobrecargas a serem escolhidas. </P ><P > Uma vez que um método é escolhido, os parâmetros são alterados se necessário, possivelmente com perda de dados (exemplo: números de ponto flutuante de precisão dupla serão convertidos para booleano). </P ></LI ><LI ><P > Na tradição do PHP, arrays e hashtables podem ser usados de forma alternada. Perceba que hashtables no PHP só podem ser indexadas por inteiros e strings; e que arrays de tipos primitivos em Java não podem ser esparsos. Também note que essas estruturas são passadas por valor, então pode ter custo em termos de memória e tempo. </P ></LI ></UL > </P ></DIV ><DIV CLASS="section" ><H1 CLASS="section" ><A NAME="java.servlet" >Java Servlet SAPI</A ></H1 ><P > O Java Servlet SAPI é montado em um mecanismo definido pela extensão Java que permite que o processador do PHP seja executado como uma servlet. A vantagem principal disso da perspectiva do PHP é que os servidores web que suportam servlet tipicamente tomam mais cuidado com criação e reuso de JVMs. Instruções de configuração para o módulo SAPI do Servlet podem ser encontrados em <TT CLASS="filename" >php4/sapi/README</TT >. Avisos: <P ></P ><UL ><LI ><P > Embora esse código seja intencionado para ser capaz de rodar em qualquer engine de servlet, ele só foi testado até hoje no Apache's Jakarta/tomcat. Relatos de bugs, estórias de sucesso e/ou patches necessárias para que esse código funcione em qualquer outro engine seriam apreciados. </P ></LI ><LI ><P > PHP tem o hábito de mudar o diretório de trabalho. sapi/servlet irá, eventualmente, mudá-lo ao anterior, mas enquanto o PHP estiver executando o engine do servlet ele pode não ser capaz de carregar classes do CLASSPATH especifidao usando caminhos relativos, ou achar o diretório de trabalho usado para administração e tarefas de compilação de JSPs. </P ></LI ></UL > </P ></DIV ></DIV ><DIV CLASS="TOC" ><DL ><DT ><B >Índice</B ></DT ><DT ><A HREF="function.java-last-exception-clear.html" >java_last_exception_clear</A > -- Limpa a última exceção Java</DT ><DT ><A HREF="function.java-last-exception-get.html" >java_last_exception_get</A > -- Pega a última exceção Java</DT ></DL ></DIV ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="function.ircg-whois.html" ACCESSKEY="P" >Anterior</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >Principal</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="function.java-last-exception-clear.html" ACCESSKEY="N" >Próxima</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >ircg_whois</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="funcref.html" ACCESSKEY="U" >Acima</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >java_last_exception_clear</TD ></TR ></TABLE ></DIV ></BODY ></HTML >