Domanda

Sto studiando per la certificazione Zend PHP5, tutto sembra a posto, ma non riesco a trovare esempi reali per il passaggio o la restituzione variabili mio riferimento.

Sarebbe molto bello, se qualcuno ha un esempio quando utilizzare questo?

È stato utile?

Soluzione

Diciamo che si vuole scrivere una funzione che elimina alcuni valori da una matrice.

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

Si potrebbe copiare l'array e restituirlo. Ma cosa succede se si vuole sapere se qualcosa è stato rimosso? Invece di modificare la matrice in-place e restituisce il numero di elementi rimossi. Quindi:

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

Se si crea una struttura complessa all'interno della vostra funzione che si può decidere di restituire un riferimento ad esso, piuttosto che una copia di esso. Ma questo è un caso abbastanza marginale perché PHP utilizza copy-on-write (cioè la sua non copiato finché non è modificata), ma ci sono alcuni casi di utilizzo validi.

Tornando con riferimento ha più senso quando si scrive una funzione membro di una classe. Si potrebbe restituire un riferimento a un membro di dati, ma questo può anche rompere l'incapsulamento.

Infine, vale la pena notare che tutti gli oggetti sono passati e restituiti per riferimento per impostazione predefinita. Tutto il resto è passato e restituito per valore.

Altri suggerimenti

Passaggio per riferimento: funzioni come asort ()

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

Gli oggetti in PHP5 sono passati per riferimento per impostazione predefinita. (Per una descrizione corretta vedere http://docs.php.net/language.oop5.references )

argomenti passaggio per riferimento è già stato risposto ...

Come un (mondo reale) ad esempio per un valore di ritorno per riferimento sbizzarrirvi href="http://en.wikipedia.org/wiki/Fluent_interface" fluente dove un metodo restituisce un riferimento allo stesso oggetto come il proprio call-contesto ($ this). Questo non avrebbe funzionato (come previsto), se il valore di ritorno è stato un copia / clone.

per es.

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;

Questo stampa foo=1 bar=2 e penso che sia il risultato che ci si aspetterebbe, niente sorprese qui. Se il metodo restituito $ questo valore, che non avrebbe funzionato più. È possibile verificare che forzando php per restituire una copia. Al posto delle linee return $this utilizzano

return clone $this;

e l'uscita sarà

foo=1 bar=n/a

(e io non lo chiamerei interfaccia intuitiva; -))

Potrebbe essere utile, se si lavora con chainig, come:

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

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

... Sry. Uguale a Volkers :( (Il Fluent Interface è il concatenamento come lo so).

Immagine si dispone di un'interfaccia fluente con un metodo di carico. Load-interfaccia sostituisce o aggiunge alcuni dati. Qui potrebbe essere utile ad agire con una chiamata dal valore di riferimento $ successo per determinare che il carico era successo.

Rientro di riferimento: Prendete un po 'di database-oggetti che hanno un elenco di righe. Il Nr. di righe di punti dati corretti di tutti gli oggetti (parallesl). Se si restituisce il nr. e passarlo l'oggetto successivo, è possibile saltare la riga in un oggetto e saltare nelle altri. avendo sempre un mucchio valide di oggetti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top