PHP5: Wird *alles* per Referenz übergeben?

Josh

Legendäres Mitglied
Hallo alle

Ich weiss, dass seit dem neuen OOP Modell von PHP5 nun Objekte immer als Referenz übergeben werden, und nicht mehr als Kopien wie noch zu PHP4 Zeiten.
Wie schaut es aus mit anderen Variablentypen? Macht es einen Unterschied, ob ich

CODE function myFunc($param) {}


oder


CODE function myFunc(& $param) {}


schreibe?
Ganz allgemein: kann mit dem Verwenden von Referenzen bei Nicht-Objekten erheblich Performanz eingespart werden? Beim Verwenden von Objekten wohl schon, aber bei Nicht-Objekten? Lohnt sich der "Mehraufwand"?

Grüsse
Josh
 
Es macht immer noch einen Unterschied, auch wenn sich das Verhalten leicht geaendert hat. Wenn man sich folgendes Beispiel ansieht, erkennt man auch, warum es so sein muss ...

CODE
function retVar ($var) {
return $var += 1;
}

function changeVar (&$var) {
return $var += 1;
}

$num = 2;
retVar ($num);
echo $num; // immer noch 2

retVar (&$num); // erzeugt eine Warnung
echo $num; // $num ist jetzt jedoch 3

changeVar ($num);
echo $num; // jetzt ist $num 4



Cheers,
den.
 
>Ganz allgemein: kann mit dem Verwenden von Referenzen bei Nicht-Objekten erheblich Performanz eingespart werden?

Ich würde mal sagen es kommt darauf an ;-)

Wenn du einen Mega-Array bearbeitest und dann als return zurücklieferst wäre vielleicht by reference schneller. Man muss aber beachten das PHP copy-on-write benutzt, also eine Referenz benutzt solange die Werte nicht geändert werden. By Reference kann wenn man nichts ändert sogar langsamer sein.

Ansonsten finde ich diese Änderung von php4 auf php5 ziemlich arg, in größeren Programmen sind die folgen nicht ganz so leicht abzuschätzen. Da dann in php6 auch die Konstruktoren anders als in php4 gemacht werden müssen bin ich am überlegen ob wir den Wechsel bei uns nicht so lange rauszögern bis es eine stabile 6er Version gibt.
 
Wer bitte setzt denn schon eine unstable oder testing auf einen Produktivsystem ein?
ph34r.gif


IMHO sollte man so Programmieren, wie es sinn macht, ich versuche auf Referenzen zu verzichten, wenn diese nicht wirklich einen Sinn machen.


@hatschi1810
In wie fern soll sich denn der Konstruktur denn wieder anders gemacht werden als bei PHP 5? Also ich brauche den Konstruktur immer mit __construct (). Ich dachte nur der Aufruf eines neuen Objektes soll restriktiver sein, damit solche Konstruktionen wie "$Objekt = & new Objeckt();" verhindert werden.
 
__construct () ist ja schon die php5-Variante, soweit ich weiß bleibt die, in php4 war ja noch eine function die gleich wie die Klasse heißt der Konstruktor, und das wird soweit ich weiß in php6 gestrichen.
 
Kannst Du mir die Quelle dafür nennen? - Da im PHP Release Management Wiki davon nichts steht, halte ich es eher für ein Gerücht, insbesondere da andere Programmiersprache dies auch unterstützen und somit zumindenstens ein Quasistandard ist.
 
Zurück
Oben