Manual do PHP
Anterior |  | Próxima

# LXXII. Integração PHP / Java

# Introdução

Existem duas maneira possíveis para integrar PHP com Java: você pode ou integrar o PHP a um ambiente Java Servlet , 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.

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.

Atenção
Este módulo é EXPERIMENTAL. 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.

# Dependências

Você precisa de uma Java VM instalada na sua máquina para usar essa extensão.

# Instalação

Esta estensão PECL não vem compilada com o PHP.

No PHP 4, os fontes desta estensão PECL podem ser encontrados no diretório `ext/` ou dentro dos fontes do PHP ou no link PECL acima. Para usar essas funções você deve compilar o PHP com suporte à Java usando a opção `--with-java[=DIR]` 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 `php-src/ext/java/README`.

Usuário do Windows devem habilitar `php_java.dll` no arquivo `php.ini` para usar essas funções. No PHP esta DLL reside no diretório `extensions/` junto aos binários do PHP para Windows. Você pode baixar esta extensão PECL DLL a apartir de downloads PHP ou em http://snaps.php.net/.

> Nota: Para habilitar esse módulo em um ambiente Windows com o PHP <= 4.0.6, você deve colocar o arquivo `jvm.dll` no PATH do seu sistema. Nenhuma DLL adicional é necessária para versões do PHP > 4.0.6.

# Configurações em execução

O comportamento dessas funções podem ser modificado pelas configurações do `php.ini`.

Tabela 1. Opções de Configuração da extensão de Java

Nome | Valor Padrão | Alterável | Changelog
--- | --- | --- | ---
java.class.path | NULL | PHP_INI_ALL |
java.home | NULL | PHP_INI_ALL |
java.library.path | NULL | PHP_INI_ALL |
java.library | JAVALIB | PHP_INI_ALL |

Para mais detalhes e definições das constantes PHP_INI_*, veja Apêndice H.

# Tipos Resource

Esta extensão não possui nenhum tipo resource.

# Constantes pré-definidas

Esta extensão não possui nenhuma constante.

# Exemplos

Exemplo 1. Exemplo de Java
`<?php // get instance of Java class java.lang.System in PHP $system = new Java('java.lang.System'); // demonstrate property access echo 'Java version=' . $system->getProperty('java.version') . '<br />'; echo 'Java vendor=' . $system->getProperty('java.vendor') . '<br />'; echo 'OS=' . $system->getProperty('os.name') . ' ' . $system->getProperty('os.version') . ' on ' . $system->getProperty('os.arch') . ' <br />'; // java.util.Date example $formatter = new Java('java.text.SimpleDateFormat', "EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz"); echo $formatter->format(new Java('java.util.Date')); ?>`

Exemplo 2. Exemplo de AWT
`<?php // This example is only intended to be run as a CGI. $frame = new Java('java.awt.Frame', 'PHP'); $button = new Java('java.awt.Button', 'Hello Java World!'); $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()` 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 `java.lang.System` que expõe a maior parte de suas funcionalidades através de métodos estáticos.

- Acessar um membro de uma instância primeiro procurará por uma propriedade bean, depois por campos públicos. Em outras palavras, `print $date.time` elel primeiro tentará trabalhar com `$date.getTime()`, depois com `$date.time`.

- 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 `java.lang.Class`, membros estáticos da classe (campos e métodos) podem ser acessados.

- Exceções disparadas resultam em avisos do PHP e em resultados `NULL`. 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:

  - java_last_exception_get()

  - java_last_exception_clear()

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

  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.

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

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

# Java Servlet SAPI

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 `php4/sapi/README`. Avisos:

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

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

Anterior | Principal | Próxima
ircg_whois | Acima | java_last_exception_clear