Quarta-feira, Abril 01, 2009

PHP5(exec) e Java

Salve a todos, eu sei faz muito tempo que não posto nada,
esta semana aqui no trabalho tive uma demanda na qual foi necessário utilizar um objeto Java, por assim dizer, no PHP, bem tudo bem se estivessímos no PHP 4, mas pra minha infelicidade geral fiz uma busca no google e o resultado não foi muito animador, pra resumir a história a melhor opção encontrada foi um projeto denominado "Bridge".
Analisando o tal "Bridge" não demorou para notar que não me atenderia:
  • é necessário instalar o tomcat
  • era necessário rodar a app no cliente( ah, esqueci de mencionar era uma app php-gtk).
Exposto estes dois pequenos detalhes logo você vai deduzir que não vou sair instalando um servidor de app na máquina de meus clientes :)

Analisando o caso, chegamos em na seguinte conclusão:
- vamos criar uma classe que irar intermediar minha app com as classes java e conforme a necessidade eu executo chamadas por meio do como exec do php uma espécie de interface.

Para exemplificar vamos criar uma classe simple em java( Hello ) que vai mudar seu retorno de acordo com sua chamada, depois um arquivo php que fara a chamada a esta classe.

-- begin Hello.java
/**
* testa a quantidade de argumentos recebido e no caso
* de nenhum argumento seja inforamdo retorna um objeto
* em notação JSON com o status de false ou true se ao
* menos um argumento for inforamdo
*
* @name Hello
* @return String
* @example java Hello | java Hello somevalue
*/
class Hello{
public static void main( String args[] ){
if( args.length == 0)
System.out.println("{\"status\": \"false\"}");
else
System.out.println("{\"status\": \"true\"}" );
}
}

-- end Hello.java
simples como tem de ser :), claro, neste exemplo.

agora vamos ao exemplo( vou fazer a chamada diretamente no PHP sem nenhuma saida em GTK porque o intuito é mostrar apenas o funcionamento).

-- begin testPHP5Java.php
*?php
$obj = exec("java Hello");
echo "resultado: \n\n";
print_r( json_decode( $obj ) );
echo "\n\n\n\n";
-- enf testPHP5Java.php

basta ir ao seu shell preferido e digitar:
php testPHP5Java.php

Domingo, Junho 24, 2007

O objeto não pode estar aberto a tudo.

Mais uma salve a todos,

Ha algum tempo trabelhei numa empresa onde conheci uma pessoa, que nesta empresa ela, trabalhava com entre outras coisa o Java e certa vez ela fez uma observação que um objeto em PHP poderia iniciar com um atributo e no decorrer de sua vida ele poderia ir adquirindo vários outros e que no Java isso não era possível, de fato o PHP tem disso, e de fato isso não desejável e outro de fato é que ele tinha razão, mas e o PHP evolui e isso é uma consante. Para enteder melhor o que estou tentando externar, vai um exemplo:
  1. <php
  2. class Foo{ }

  3. $f = new Foo();
  4. $f->nome = "João Roberto";
  5. echo $f->nome;
  6. ?>

  7. saída: João Roberto.
Este comportamento, inadequado ao meu ver se dá devido ao PHP ter sua verificação relaxada ou seja ele verifica se é um objeto, mas se o atributo existe ou não para ele tanto faz. Na verdade não existir ele criará em run-time. Mas nem sempre isso é desejável. queremos uma forma de dizer ao PHP que se o atributo existir ele atribua o valor informado a este, porém, se não existir ele lance um SuperNomeGrandeParaDefinirQueAlgoNãoEstaCertoException. Nossa!

  1. <php
  2. class Foo{
  3. public $nome;
  4. public function __set( $nomeAtributo, $valorAtribtuo ){
  5. if( isset( $this->$nomeAtributo ) )
  6. $this->$nomeAtributo = $valorAtribtuo;
  7. else
  8. throw new Exception( "Error: O atributo: {$nomeAtributo} não existe." );
  9. }
  10. }

  11. $f = new Foo();
  12. $f->nomes = "João Roberto";
  13. ?>
O método mágico __set é executado imediatamente antes de uma atribuição de valor a um atributo. Isso possibilitará a verificação se tal atributo existe ou não. Pausa para as apresentações:

void __set ( string name, mixed value )

Onde void é retorno, ou seja, não retorna nada. string name é o nome do atributo que está sendo informado e por fim mixed value é o valor que está sendo atribuido para este atributo.

. . .continuando . . .

Com isso a gente força o PHP a não aceitar qualquer coisa, afinal, ele não é nem de longe é parente do ponto( . ) das Expressões Regulares.

Em nosso próximo encontro estaremos vendo sobrecarga de métodos.
Até Lá.

Quarta-feira, Maio 02, 2007

toString ou __toString?

Salve a todos,

Em recente labuta com as várias e várias formas de se fazer algo igual de forma diferente com o PHP, o que é extremamente bacana :), me deparei com uma função pra lá de útil quando estamos trabalhando com classes.

Mas desta vez eu encontrei apenas uma forma correta de fazer o que queria: Ao chamar o objeto ele me mostrar os valores de seus atributos, todos eles, sem ter que ficar criando um echo ou um print para cada um destes atributos.

Sim tem como sim.
Até pouco tempo atrás eu criava um método para quando eu o chamasse fosse impresso todos os valores dos atributos da classes, mas isso me forçava a invocar o objeto com o nome deste método:
<?php
// ...
$objeto->verValoresAtributos();
// ...
?>

Que tem de errado nisso? Nada! Mas, pra que você vai reinventar a roda se o PHP já lhe dá um método próprio para isso? Além do mais quando você usa o método correto você não precisa invocar o método, o PHP vai verificar que estar tentando exibir o objeto e ao invés de responder com uma resposta tipo:
Saída na tela:
Catchable fatal error: Object of class NossaClasse could not be converted to string in /srv/www/htdocs/NossaClasse.php on line 16

Cá pra nós tem coisa mais chata do que uma resposta destas? Quando queria-mos algo como:
Saída na tela: Olá augustowebd, eu tenho aqui os seguintes atributos: atributo1: valor do atributo1, atributo2: valor do atributo 2, ...

Então vamos fazer a coisa da forma certa. Definamos uma classes para nosso teste.
<?php
class NossaClasse{

// atributo qualquer
private $nome;

// construtor recebe valor para atributo qualquer
public function NossaClasse( $nome = null ){
$this->nome = $nome;
}

public function __toString(){
return $this->nome;
}
}
?>

Agora é criar seu objeto e dá um echo.
<?php
// ...
$meuObjeto = new
NossaClasse( "augustowebd" );
echo
$meuObjeto;
?>

Por fim, vamos cientificamente conhecer o __toString:
A assinatura do __toString é: function string __toString( void )
O que quer dizer: Este método retorna uma string e que não recebe nenhum paramentro( void ).

Respondendo a pergunta do título: __toString com dois underlines :).

Um abraço e até a próxima.

Quinta-feira, Março 23, 2006

boas vindas

Salve a todos os navegantes, tudo bem essa frase é do Fernando Alsemo, mas, aqui nada, tem a ver com essa figura, por sinal, me parece ser muito querida pela comunidade Java, continuando, gostaria de agradecer a todos que de propósito ou descuido vieram parar nesse humilde diário.

Aqui, futuramente, nós iremos falar sobre assuntos bastantes interessantes, tais como, javascript, XML, PHP( essa salva o mundo quando se trata de WEB ), isso mesmo sou programador Web based, ou se preferir PHPBased, falaremos sempre que necessário de bancos, o MySQL, por mim é mais usado, HTML, Tableless, Ajax, etc.
Este humilde espaço também estará a sua disposição para sempre que quiser postar seus comentários e seus artigos.

Sem mais, devido ao grande número de afazeres, vou ficando por aqui, em meu próximo post falarei um pouco sobre javascript onde iniciaremos com alguns exemplos e também alguns bons links para o mesmo.
até a próxima.