Frage

Ich bin für die Zend PHP5-Zertifizierung zu studieren, alles sieht gut aus, aber ich kann nicht reale Welt Beispiele für die Weitergabe oder die Rückkehr Variablen meiner Referenz finden.

Es wäre sehr schön, wenn jemand ein Beispiel hat, wenn diese zu benutzen?

War es hilfreich?

Lösung

Angenommen, Sie haben eine Funktion schreiben möchten, die aus einem Array bestimmten Werten entfernt.

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

Sie können das Array kopieren und zurück. Aber was, wenn Sie wissen wollen, ob etwas entfernt wurde? Stattdessen ändern Sie das Array in-place und geben die Anzahl der Elemente entfernt. Also:

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

Wenn Sie eine komplexe Struktur in Ihrer Funktion erstellen können Sie einen Verweis auf sie zurückkehren wollen, anstatt eine Kopie davon. Aber das ist ein ziemlich marginal Fall, weil PHP Anwendungen copy-on-write (dh es ist nicht kopiert, bis es geändert wird), aber es gibt einige gültige Anwendungsfälle.

durch Bezugnahme Rückkehr macht mehr Sinn, wenn Sie eine Elementfunktion einer Klasse zu schreiben. Sie könnten einen Verweis auf ein Datenelement zurück, aber dies kann auch Verkapselung brechen.

Schließlich ist es erwähnenswert, dass alle Objekte weitergegeben und wieder durch Bezugnahme in der Standardeinstellung. Alles andere ist vorbei und zurück nach Wert.

Andere Tipps

Pass von Referenz: Funktionen wie asort ()

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

Objekte in php5 sind durch Bezugnahme standardmäßig übergeben. (Für eine korrekte Beschreibung finden Sie unter http://docs.php.net/language.oop5.references )

durch Bezugnahme Argumente Passing bereits beantwortet worden ...

Als (reale Welt) Beispiel für einen Rückgabewert von Referenz holt jedes Fluent Interface wo ein Verfahren einen Verweis auf das gleiche Objekt wie einen eigenen Anruf-Kontext zurück ($ this). Dies würde nicht funktionieren (wie erwartet), wenn der Rückgabewert eine Kopie / Klon ist.

z.

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;

Diese Drucke foo=1 bar=2 und ich denke, das ist das Ergebnis man erwarten würde, überrascht nicht hier. Wenn die Methode $ diesen Wert zurück, wäre es nicht mehr. Sie können das testen, indem PHP zwingt eine Kopie zurückzukehren. Anstelle der return $this Linien Verwendung

return clone $this;

und der Ausgang wird sein

foo=1 bar=n/a

(und ich würde diese Schnittstelle nicht nennen intuitiv; -))

Es könnte nützlich sein, wenn Sie mit chainig arbeiten, wie:

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

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

... Sry. Das gleiche wie Volkers :( (Die Fluent Interface ist Chaining wie ich es kennen).

Bild Sie haben eine fließend-Schnittstelle mit einer Last-Methode. Die Load-Schnittstelle ersetzen oder fügt einige Daten. Hier könnte es sinnvoll sein, mit einem Aufruf von Referenzwert $ Erfolg zu handeln, um festzustellen, dass die Last erfolgreich war.

Zurück nach Referenz: Nehmen Sie einige Datenbank-Objekte, die eine Liste von Zeilen aufweisen. Die Nr. von Zeilen Punkten auf richtige Daten aller Objekte (parallesl). Wenn Sie die nr zurückzukehren. und es zum nächsten Objekt übergeben, können Sie die Zeile in einem Objekt überspringen und überspringen auch in den anderen. Immer ein valide Bündel von Objekten mit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top