Pergunta

Estou estudando para a Certificação Zend PHP5, tudo parece bem mas não consigo encontrar exemplos do mundo real para passar ou retornar variáveis ​​minha referência.

Seria muito bom se alguém tivesse um exemplo de quando usar isso?

Foi útil?

Solução

Digamos que você queira escrever uma função que remova certos valores de um array.

function remove_elements($array, $item1, $item2, ...) {
  ...
}

Você poderia copiar o array e devolvê-lo.Mas e se você quiser saber se alguma coisa foi removida?Em vez disso, você modifica o array no lugar e retorne o número de elementos removidos.Então:

function remove_elements(&$array) {
  // remove elements
  return $number_removed;
}

Se você criar uma estrutura complexa dentro de sua função, talvez queira retornar uma referência a ela em vez de uma cópia dela.Mas este é um caso bastante marginal porque o PHP usa copy-on-write (ou seja, não é copiado até ser modificado), mas existem alguns casos de uso válidos.

Retornar por referência faz mais sentido quando você escreve uma função membro de uma classe.Você poderia retornar uma referência a um membro de dados, mas isso também pode quebrar o encapsulamento.

Por último, vale a pena notar que todos os objetos são passados ​​e retornados por referência por padrão.Todo o resto é passado e retornado por valor.

Outras dicas

Passe por referência:funções como um tipo()

$array = array(3, 2, 1);
asort($array);

Objetos no php5 são passados ​​por referência por padrão.(Para uma descrição correta, consulte http://docs.php.net/linguagem.oop5.references)

A passagem de argumentos por referência já foi respondida...

Como exemplo (do mundo real) de um valor de retorno por referência, escolha qualquer interface fluente onde um método retorna uma referência ao mesmo objeto que seu próprio contexto de chamada ($this).Isso não funcionaria (como esperado) se o valor de retorno fosse uma cópia/clone.

Por exemplo.

class MyClass {  
  protected $foo = 'n/a';
  protected $bar = 'n/a';

  function foo($val) {
    $this->foo = (int)$val;
    return $this;
  }

  function bar($val) {
    $this->bar = (int)$val;
    return $this;
  }

  function __toString() {
    return 'foo='.$this->foo.' bar='.$this->bar;
  }
}

$o = new MyClass;
$o->foo(1)
  ->bar(2);
echo $o;

Isso imprime foo=1 bar=2 e acho que esse é o resultado que se esperaria, sem surpresas aqui.Se o método retornasse $this por valor, não funcionaria mais.Você pode testar isso forçando o php a retornar uma cópia.Ao invés de return $this uso de linhas

return clone $this;

e a saída será

foo=1 bar=n/a

(e eu não chamaria essa interface de intuitiva ;-))

Pode ser útil se você trabalhar com chainig, como:

    public function addObject(array &$someData){
$newObj = Fabric::create($someData);
$this->listOfObj[] = $newObj;
return $newObj;
}

....
$this->addObj(array('idontknow' => 'anything'))->setName('mr.knowitall')->save();

...Desculpa.O mesmo que Volkers :( (A interface fluente está encadeando como eu conheço).

Imagem que você tem uma interface fluente com um método de carregamento.A interface Load substitui ou adiciona alguns dados.Aqui pode ser útil agir com uma chamada pelo valor de referência $success para determinar se o carregamento foi bem-sucedido.

Retornar por referência:Pegue alguns objetos de banco de dados com uma lista de linhas.O nº.de linhas aponta para os dados corretos de todos os objetos (paralelos).Se você devolver o nº.e passá-lo para o próximo objeto, você pode pular a linha em um objeto e pular nos outros também.Sempre tendo um monte de objetos válidos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top