dedlfix: Zeilenumbrüche mit eregi zulassen

Beitrag lesen

echo $begrüßung;

Die umgebenden runden Klammern kannst Du getrost entsorgen, denn return (foo()); ist exakt dasselbe wie return foo();.

Es ist richtig, dass man die äußeren runden Klammern an der Stelle nicht benötigt und weglassen kann. Aber "exakt dasselbe" ist es nicht.

Zunächst: Eine Variable ist ein Bezeichner, der auf einen Container verweist, in dem ein Wert abgelegt ist. Eine Variable beinhaltet also nicht direkt einen Wert sondern ist sozusagen nur einen Verweis auf einen Container.

Eine Funktion kann beispielsweise eine Referenz auf eine Variable zurückgeben.

function &foo() {
    return $bar;
  }

Durch das & vor dem Funktionsnamen wird, anders als sonst, keine Kopie des Containerinhalts (auf den $bar verweist) zurückgegeben, sondern eine Referenz auf $bar.

$qux =& foo();

$qux verweist nun ebenso wie $bar auf den selben Variablencontainer und Änderungen in $qux sieht man auch in $bar und umgekehrt.

Schreibt man nun

return ($bar);

erzeugt man damit einen Ausdruck, dessen Inhalt aus der Variable $bar genommen wird. Es wird also eine Kope des Variablencontainers erzeugt, mit der die Ausdrucksberechnung stattfindet. Der Ausdruck selbst ist unsprektakulär und außer der Containerkopie passiert nichts weiter. Das Ergebnis ist jedenfalls ein kopierter Wert und keine Referenz.

Das gleiche passiert auch, wenn keine Referenzen im Spiel sind, nur ist es hier für das Ergebnis nicht weiter von Belang, ob das eine Kopie oder eine kopierte Kopie ist. Auch

return (foo());

spielt in der gleichen Liga, hier ist es eben der von der Funktion foo() zurückgegebene Container der noch einmal als Ausdruck ausgewertet wird bevor er dem return übergeben wird.

Interessant ist das Ganze unter PHP5 und bei Objekten, denn Objekte werden ab der Version generell als Referenz übergeben. Solche Fehler sind nicht einfach zu finden, wenn man mit dem Objekt weiterarbeiten will, stattdessen aber von irgendeinem Zwischenschritt ungewollt eine Kopie weitergegeben wird.

Wenn man eine Ausführungen mit den Interna von PHP beim Variablenhandling vergleicht wird man feststellen, dass sie nicht ganz richtig sind. Aber das tut nichts weiter zur Sache, denn nach außen hin verbirgt PHP, dass Variablencontainer nicht immer direkt kopiert werden, wenn eine Zuweisung stattfindet sondern erstmal nur eine Quasi-Referenz erzeugt wird und das eigentliche Kopieren erst bei Änderungen einer der Containerinhalte passiert.

echo "$verabschiedung $name";