dedlfix: Referenzrückgabe unter PHP 4.4.0

Beitrag lesen

echo $begrüßung;

Nachdem ich neulich auf die Version 4.4.0 upgedatet habe, beschwert sich PHP nun über das halbe PEAR. Wie ich finde, macht es das teilweise zu Recht, teilweise aber nicht. Es geht dabei immer um Rückgaben von Funktionen per Referenz:

function & foo() {...}

Die Fehlermeldung lautet immer
  Notice: Only variable references should be returned by reference

Das tritt neuerdings (unter 4.3.11 kam die Notice noch nicht) auf beispielsweise in PEAR-File_Find::maptree

function &maptree(...) {  
  ...  
  return array(wert1, wert2);  
}

Hier wird ja auch keine Variablenreferenz zurückgegeben. Ich glaubte bisher, dass für das Array Speicher allokiert würde und eine Referenz darauf von der Funktion zurückgegeben wird. Und ohne & würde Speicher reserviert werden, dann eine Kopie davon zurückgegeben werden; also doppelter Speicherverbrauch plus Kopiervorgang.

Weiteres Beispiel, gleiche Klasse:

function &search(...) {  
  ...  
  return ($matches);  
}

Kaum nimmt man die überflüssigen Klammern um $matches weg, verschwindet auch die Notice. Die Klammern scheinen mir hier eine (ungewollte) Kopie zu erzeugen, die (bzw. eine Referenz darauf) statt der Referenz auf $matches zurückgegeben wird.

Noch ein Beispiel, und damit komme ich zu meiner Verwunderung:

Klasse HTML_QuickForm (verlinkt ist die ältere Version 1.155. Ab 1.156 ist die Ursache für die Warnung beseitigt/umgangen(?) )
Es geht um die Funktion createElement() (Zeile 511)
Hier das Prinzip in Kurzform:

function &x() {  
  $x = 43; // in HTML_QuickForm wird allerdings eine Objektinstanz erzeugt  
  return $x;  
}  
  
function &y() {  
  return x();  
}  
  
echo y();

Angenommen hätte ich, dass die Referenz auf $x durchgereicht wird.
In den gefixten Versionen wird die Funktion y() wie folgt definiert:

function &y() {  
  $y =& x();  
  return $y;  
}

Kann in der ersten y()-Definition nur der Compiler nicht erkennen, dass er hier von x() schon eine Referenz bekommt? Oder wodurch wird die Notice gerechtfertigt?

echo "$verabschiedung $name";