Objetos e referências no PHP5
Estava lendo esta apresentação da Laura Thomson, autora
de um ótimo livro sobre a linguagem, quando deparei com um erro
no slide 95. Ela afirma que no PHP4 os objetos são automaticamente
passados por referência, enquanto no PHP5 não. O que acontece
é justamente o contrário. O exemplo abaixo demonstra o funcionamento
da atribuição de objetos (operador =) a referências no PHP5.
class MyClass {
}
$a = new MyClass();
$b = clone $a;
if ($a === $b) {
echo '$a and $b point to the same object.'."\n";
} else {
echo '$a and $b DO NOT point to the same object.'."\n";
}
$c = new MyClass();
$d = $c;
if ($c === $d) {
echo '$c and $d point to the same object.'."\n";
} else {
echo '$c and $d DO NOT point to the same object.'."\n";
}
A saída desse programa é a seguinte:
$a and $b DO NOT point to the same object.
$c and $d point to the same object.
Os pontos importantes a notar:
- O operador
cloneforça a criação de uma nova instância deMyClass, com os mesmos atributos de$a(o objeto é “clonado”). - O operador
===, quando aplicado a duas referências, indica se ambas apontam para um mesmo objeto. - O operador
=, quando aplicado a dois objetos, faz com que a referência do lado esquerdo do operador aponte para o mesmo objeto para o qual a referência do lado direito aponta (uma cópia do objeto não será criada em memória).
No manual oficial do PHP também há um parágrafo que expressa exatamente esse conceito:
[...] quando se utiliza o operador de identidade (
===), objetos são idênticos se e apenas se eles são a mesma instância da mesma classe.

February 12th, 2008 às 8:13 pm
Isso quer dizer que se fosse php 4, pra que $c e $d se tornassem a mesma referência seria necessário o &? Assim:
$d = &$c;
?
February 12th, 2008 às 10:34 pm
Exatamente isso.