Diogo Besson :: Websites > Diogo Besson :: tecnologia > tecnologia > Setando valores em objetos Java versus PHP
Setando valores em objetos Java versus PHP é mais um post comparativo entre Java e PHP. Estou quase abrindo uma série JAVA X PHP neste weblog! ;D
Depois da aula de ontem fiquei ainda mais curioso sobre o tratamento de memória dessas duas linguagens. Se já não bastasse a diferença que existe com relação ao tratamento de tipo e o retorno que os scripts dão para os ternários, ontem vimos como elas atribuem valores para os atributos das classes.
Criamos 3 arquivos
Pessoa.java :: classe que possui os atributos de uma Pessoa;
Parametros.java :: classe que tem dois metodos. Um que muda o valor de uma variavel x e outra que muda o atributo nome da classe Pessoa;
Teste.java :: classe que tenta modificar o valor de x, de y e do nome da Pessoa.
Pessoa .java
int mudarInt (int x) {
void mudarNome (Pessoa p) {
p.nome = "Joao";
Parametros p = new Parametros();
int y = p.mudarInt(x);
pes.nome = "Jose";
p.mudarNome(pes);
System.out.println("X = "+x);
System.out.println("P.NOME = "+pes.nome);
Ao compilar Teste.java temos como retorno:
E:xampphtdocstestesparametrizacao> java Teste
P.NOME = Joao
Isso acontece porque X é uma variavel local em ambos os casos. Dentro de Teste ele está no escopo da classe e dentro de Parametros, está no escopo do método mudarInt. Este método retorna o valor 10, que é atribuído a variável Y, logo X permanecerá com valor 4 dentro do escopo de Teste e Y recebeu 10 do método mudar Int.
A grande sacada está no valor do atributo "nome" da classe Pessoa…
Quando estamos trabalhando com atribuição das classes em Java, o que acontece é uma cópia do valor da variável que referencia um objeto. Isso nos leva a entender que o trabalho de troca de valores dos atributos dentro de uma classe para esse objeto copiado está sempre se referindo ao mesmo objeto.
Tivemos como exemplo os correios.
Você pode mandar duas cartas para o mesmo endereço. O endereço em questão é a referência para o seu objeto. Duas cartas (comandos) referenciando (destinatário para o endereço de referência) o mesmo objeto.
Como a última ação foi mudar o valor de nome do objeto único que foi criado e referenciado para 'João', este irá fixar e devolver o valor citado.
Diferentemente do que acontece com o PHP.
O PHP não cria cópias de referências, portanto a cada atribuição de referências dentro de um método, uma nova instância será criada. Dá pra imaginar que o valor do atributo nome da classe Pessoa na primeira referência será 'José' e na segunda referência será 'João'. Ao chamar o valor do atributo ele devolverá 'José', pois o objeto chamado está na primeira referência, enquanto que a segunda existe apenas dentro do escopo do método e será eliminado da memória pelo interpretador.
criamos igualmente 3 arquivos:
Pessoa.class.php :: classe que possui os atributos de uma Pessoa;
Parametros.class.php :: classe que tem dois metodos. Um que muda o valor de uma variavel x e outra que muda o atributo nome da classe Pessoa;
Teste.class.php :: classe que tenta modificar o valor de x, de y e do nome da Pessoa.
Pessoa.class.php
/** setters and getters para atributo ID */
/** setters and getters para atributo NOME */
Parametros.class.php
public function mudarInt($x) {
public function mudarNome($objeto, $nome) {
$objetoPessoa = $objeto;
$objetoPessoa->setNome = $nome;
Teste.class.php
/** inclui as classes auxiliares para a classe Teste */
require_once("Pessoa.class.php");
require_once("Parametros.class.php");
$p = new Parametros();
$pes = new Pessoa();
$y = $p->mudarInt($x);
$pes->setNome("Jose");
$p->mudarNome($pes, "Joao");
$saida = "X = ".$x."<br />Y = ".$y."<br />PES::NOME = ".$pes->getNome()."<hr>";
Ao interpretar a classe Teste.class.php temos como retorno:
PES::NOME = Jose
Muito interessante, porém creio que o tratamento de objetos em Java tem menos gambiarras e a lógica de copiar referências deveria ser adotada como padrão para qualquer linguagem de programação. Vamos esperar as próximas versões do PHP pra ver o que acontece.