Diogo Besson :: tecnologia

Setando valores em objetos Java versus PHP

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.

EM JAVA

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

class Pessoa {
int id;
String nome;
}

Parametros.java

class Parametros {
int mudarInt (int x) {
x = 7;
return 10;
};

void mudarNome (Pessoa p) {
p.nome = “Joao”;
}
}

Teste.java

class Teste {
public static void main (String [] args) {
int x = 4;

Parametros p = new Parametros();

int y = p.mudarInt(x);

Pessoa pes = new Pessoa();
pes.nome = “Jose”;

p.mudarNome(pes);

System.out.println(“X = “+x);
System.out.println(“Y = “+y);
System.out.println(“P.NOME = “+pes.nome);

}
}

Ao compilar Teste.java temos como retorno:

E:xampphtdocstestesparametrizacao> java Teste
X = 4
Y = 10
P.NOME = Joao

Process java exited with code 0

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.

Vamos fazer o teste?

EM PHP

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

class Pessoa{
var $id;
var $nome;

/** setters and getters para atributo ID */
public function setID($id) {
$this->id = $id;
}
public function getID() {
return $this->id;
}

/** setters and getters para atributo NOME */
public function setNome($nome) {
$this->nome = $nome;
}
public function getNome() {
return $this->nome;
}
}

Parametros.class.php

class Parametros {
public function mudarInt($x) {
$x = 7;
return 10;
}

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”);

class Teste {
public function __construct(){
$x = 4;

$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>”;

echo $saida;
}
}

$teste = new Teste();

Ao interpretar a classe Teste.class.php temos como retorno:

X = 4
Y = 10
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.

um abraço ao visitante

Diogo Besson

Leave a Comment

O seu endereço de e-mail não será publicado.