Passaggio per riferimento in PHP 5.x
-
22-09-2019 - |
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?
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.