segunda-feira, 20 de dezembro de 2010

O PHP não é besta

Falando de referência em objetos, que é o padrão do PHP 5, vemos que quando uma variável referencia um objeto e outra variável referencia essa primeira variável que é um objeto, ja está automáticamente por referência. Ou seja, o que for mudado no primeiro objeto será mudado no outro que está referenciando-o, só que, caso o primeiro objeto vá para o espaço, acabe, seja deletado, disreferenciado, unsetado, o objeto da segunda variável continua intacto, vejamos.

<?php
echo '<pre>';
class Teste { }
$a = new Teste;
$a->nome = 'não sou besta';

$b = $a;
$b->nome = 'nem eu';

var_dump($a, $b);
unset($a);
var_dump($a, $b);
// SAÍDA
object(Teste)#1 (1) {
["nome"]=>
string(6) "nem eu"
}
object(Teste)#1 (1) {
["nome"]=>
string(6) "nem eu"
}

Notice: Undefined variable: a in /var/www/teste.php on line 17
NULL
object(Teste)#1 (1) {
["nome"]=>
string(6) "nem eu"
}

você pode estar pensando, - sim como faço para que os objetos não sejão referencias uns dos outros numa atribuição?, simples, basta adicionar o operador clone antes do objeto a ser atribuido. por exemplo:

<?php
echo '<pre>';
class Teste { }
$a = new Teste;
$a->nome = 'não sou besta';

$b = clone $a;
$b->nome = 'nem eu';

var_dump($a, $b);
unset($a);
var_dump($a, $b);
// SAÍDA
object(Teste)#1 (1) {
["nome"]=>
string(14) "não sou besta"
}
object(Teste)#2 (1) {
["nome"]=>
string(6) "nem eu"
}

Notice: Undefined variable: a in /var/www/teste.php on line 12
NULL
object(Teste)#2 (1) {
["nome"]=>
string(6) "nem eu"
}

No próximo post falarei do operador clone e o método especial __clone, e não esqueci de falar sobre o PDO, estou esperando, para poder fazer um post legal e entendível.

Nenhum comentário:

Postar um comentário