Ich habe einige C ++ - Kenntnisse und weiß, dass dort häufig Zeiger verwendet werden, aber ich habe angefangen, mich mit PHP-Open-Source-Code zu befassen, und sehe keinen Code, der Referenzen in Methoden verwendet.
Stattdessen verwendet der Code immer einen Rückgabewert, anstatt den Verweis auf die Variable an die Methode zu übergeben. Diese ändert dann den Wert dieser Variablen und gibt ihn einfach zurück.
Ich habe gelesen, dass die Verwendung von Referenzen weniger Speicherplatz beansprucht. Warum werden sie in PHP nicht verwendet?
return array($foo, $bar);
undlist($A, $B) = foobar();
Antworten:
Ihre Behauptung, dass Referenzen selten verwendet werden, ist falsch. Wie andere bereits erwähnt haben, gibt es eine Menge nativer Funktionen, die Referenzen verwenden. Bemerkenswerte Beispiele sind die Array-Sortierfunktionen und
preg_match()
/preg_match_all()
. Wenn Sie eine dieser Funktionen in Ihrem Code verwenden, verwenden Sie auch Verweise.Weiter sind Referenzen in PHP keine Zeiger. Da Sie einen C ++ - Hintergrund haben, kann ich die Verwirrung verstehen, aber PHP-Referenzen sind ein ganz anderes Biest, sie sind Aliase für eine Symboltabelle . Leistungssteigerungen, die Sie von C ++ - Referenzen erwartet haben, gelten einfach nicht für PHP-Referenzen.
Tatsächlich ist die Übergabe von Werten in den meisten Szenarien schneller und weniger speicherintensiv als die Übergabe von Referenzen. Die Zend Engine, der Kern von PHP, verwendet einen Copy-on-Write- Optimierungsmechanismus, der keine Kopie einer Variablen erstellt, bis sie geändert wird. Das Übergeben von Referenzen unterbricht normalerweise das Copy-on-Write-Muster und erfordert eine Kopie, unabhängig davon, ob Sie den Wert ändern oder nicht.
Haben Sie keine Angst, Referenzen in PHP zu verwenden, wenn Sie dies benötigen, und versuchen Sie nicht nur, diese zu optimieren. Denken Sie daran, vorzeitige Optimierung ist die Wurzel allen Übels .
Weitere Lektüre:
quelle
f($obj)
gegebenfunction f($x) { $x = new X; }
, hätten$obj
zu einem beziehen anderes Objekt als vor dem Aufruff()
. Da Objekte jedoch nicht als Referenz übergeben werden, wird $ obj nicht geändert, wenn Sie dies mit PHP ausführen. Auf diese Weise macht PHP dasselbe wie Java.PHP führt bereits eine Copy-on-Write-Funktion aus, bei der kein neuer Wert erstellt wird, bis Sie etwas ändern, sodass durch die Verwendung von Referenzen nicht viel Speicherplatz gespart wird. Dies kann sogar zu Problemen führen, die PHP intern verursacht, um die Speichernutzung zu verringern und die Situation noch schlimmer zu machen.
Hinzu kommt, dass Referenzen die Dinge im Allgemeinen etwas zu magisch machen. Der Standardwert und damit das, was die meisten Menschen erwarten, ist der Vorübergehender Wert. Wenn ich
$i
zu einer Funktion übergehe , wird es enorm kompliziert, wenn ich mich darum kümmern muss, ob sich diese Funktion auf mysteriöse Weise$i
zu etwas anderem ändert , und auf diese Weise für alle Fälle defensive Kopien anfertigt. (Es kann bereits geändert werden,$i
wenn der Wert ein Objekt ist, aber meiner Meinung nach sollte es nicht.)Grundsätzlich würde ich nur Pass-by-reference nützlich finden für „out“ Parameter, dh Variablen i erwarten wieder aus der Funktion und nicht weiter in, a la
preg_match
‚s&$matches
. Sogar für Funktionen, die das Objekt, in das übergeben wird , deutlich verändern, wiesort
oderarray_pop
, fühlt sich das ein bisschen icky an ... aber das ist es, woran wir festhalten.quelle
PHP ist eine weborientierte Sprache.
Webseiten werden schnell geliefert und sollten leicht sein.
Das übliche PHP-Programm ist im Bruchteil einer Sekunde aktiv und belegt einige hundert Kilobyte Speicher.
Für solche Optimierungen gibt es keine Verwendung.
quelle
Einige Gründe im Fluge:
quelle
Ich denke, das ist nur eine Wahl der Entwickler, nichts mit der Sprache zu tun. Viele PHP-Codes (eingebaute und nicht eingebaute) verwenden Referenzen. Werfen Sie einen Blick auf die Array-Funktionen in PHP, von denen viele Referenzen verwenden.
preg_match
Verwendet Referenzen.Ich denke, einer der Gründe, warum Entwickler keine Referenzen verwenden, ist, dass dies verwirrend sein kann. Sie rufen eine Funktion auf und eine der Variablen wird möglicherweise (oder möglicherweise nicht) aktualisiert, weil es sich um eine Referenz handelte. Wenn Sie also debuggen, ist möglicherweise nicht klar, warum sich der Wert von
$x
jsut magisch geändert hat.quelle
Das grundlegende Problem bei Ihrer Frage ist, dass Sie davon ausgehen, dass dies auch in C ++ der Fall ist. Ist es nicht. Wir mögen Ausgabeparameter nicht und verwenden sie so wenig wie möglich. Sie sind nur in APIs im C-Stil üblich.
quelle
Ich kenne viele PHP-Funktionen, die dies tun. Schauen Sie sich
preg_match()
zum Beispiel an.$matches
wird als Referenz übergebenWenn Sie eine Funktion schreiben möchten, die Argumente als Referenz verwendet, verwenden Sie die folgende Syntax
$ a und $ b werden als Referenz übergeben. $ c wird als Wert übergeben.
quelle