Objetos e referências no PHP5

Em: 12/02/2008 Tags: Referencie do seu blog (Trackback)

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 clone força a criação de uma nova instância de MyClass, 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.

Artigos relacionados:

2 respostas para “Objetos e referências no PHP5”

  1. Thânia Clair disse:

    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;

    ?

  2. Caio Moritz Ronchi disse:

    Exatamente isso.

Escreva um comentário (utilize o formato Markdown)