SóProvas


ID
1339924
Banca
PR-4 UFRJ
Órgão
UFRJ
Ano
2012
Provas
Disciplina
Programação
Assuntos

Analise o seguinte código PHP abaixo.

< ?php
    class A {
     public $foo = ‘laranja’;
   }
   class B {
     public $foo = ‘banana’;
      public $ola = ‘aloalo’;
   }
   function normalAtrib($obj) {
     $obj->foo = ‘trocado’;
     $obj = new B;
     $obj->foo = ‘mudeidenovo’;
   }
  function referenceAtrib(&$obj) {
    $obj->foo = ‘mudado’;
    $obj = new B;
  }
  $a = new A;
      normalAtrib($A);
     referenceAtrib($A);
echo “{$a->foo}”;
?>

Assinale a alternativa que contém o valor de $a->foo a ser exibido pelo comando echo contido no final do código PHP acima.

Alternativas
Comentários
  • Gabarito da banca: C (laranja)


    Acredito que esta questão se refere à versão 4 do PHP, observando a sintaxe usada na criação dos objetos:

    $a = new A; // PHP4

    $obj = new B; // PHP4

    ao invés de usar :

    $a = new A(); // PHP5

    $obj = new B(); // PHP5


    Outra observação sobre o código do enunciado, não sei se foi proposital ou se foi erro de edição da Banca, foi usado o nome da classe A nas chamadas das funções e não a variável $a (instância da classe A):

    normalAtrib($A);
    referenceAtrib($A);


    Caso usemos a versão 5 do PHP, com as devidas correções e com as seguintes chamadas:


    $a = new A();
    normalAtrib($a);
    referenceAtrib($a);
    echo "{$a->foo}";


    será exibido:

    banana


    Esta mudança de comportamento é devida a reescrita do "core engine" do PHP 5 em relação ao PHP 4. O modelo de objetos da versão 4 é pobre, ao passo que na versão 5 o modelo de objetos é quase completo.


    No livro "Object-Oriented Programming with PHP5" é explicado que o PHP5 faz uma "cópia rasa" (shallow copy) dos objetos, nas atribuições e nas passagens de parâmetros (ou seja, a variável da instância é uma referência para o objeto) enquanto o PHP4 faz uma "cópia profunda" (deep copy, similar a uma clonagem dos objetos).


    Voltando ao exemplo, na versão 5 do PHP, após a chamada da função referenceAtrib($a), a variável $a estará referenciando uma instância da classe B e portanto será exibido 'banana'.

  • Também acho que, pelo algoritmo, deveria ser exibido "banana". Portanto, a resposta correta deveria ser a opção A e não a opção C.

  • Eu acho que a malícia da questão está nos últimos quatro comandos. Não existe variável "$A", portanto o que está abaixo em vermelho não faz nada, ao contrário dos comandos em azul. Segue:

    $a = new A;

    normalAtrib($A); 

    referenceAtrib($A);

    echo “{$a->foo}”;

    Resultado: Laranja