PHP: Speicherplatz sparen mit Referenzen
Sobald Sie in PHP eine selbst geschriebene Funktion mit einer Variablen als Parameter aufrufen, passiert Folgendes: Die Variable wird kopiert und innerhalb der Funktion weiterverarbeitet. Das bedeutet: doppelter Speicherbedarf. Das schlägt besonders dann zu Buche, wenn es große Datenmengen zu verarbeiten gilt.
Besser ist es in vielen Fällen, die Parameter-Variablen als Referenz zu übergeben. Statt komplett den Inhalt zu kopieren, erhält die Funktion dann lediglich eine Information darüber, wo sich die Original-Daten befinden. Das nennt man "Zeiger" oder "Referenz".
Ein Beispiel verdeutlicht das Prinzip:
<?php
$strLangerString = 'Das ist aber ein langer String....';
echo countchars(&$strLangerString, 'a');
function countchars($argStrHaystack, $needle)
{
return preg_match_all('/'.$needle.'/', $argStrHaystack, $arrDummy);
}
?>
Zunächst belegen Sie die Variable $strLangerString mit einer Zeichenkette. Im Beispiel ist die aus Platzgründen relativ kurz. Danach rufen Sie die Funktion countchars auf. Die zählt das Vorkommen eines Zeichens in einer Zeichenkette.
Beim ersten Parameter der Funktion fällt ein besonderes Zeichen auf: das kaufmännische Und &. Das bedeutet, dass die nachfolgende Variable als Referenz übergeben wird. Für diesen Einsatzzweck ist das auch ideal. Denn die Funktion muss lediglich Zeichen zählen und ändert nicht den Inhalt der Variablen.
Allerdings: Sobald Sie die übergebenen Daten in der Funktion ändern, ändern Sie auch den Inhalt der übergebenen Original-Variable. Wie sich eine Änderung in der Funktion auswirkt, zeigt das folgende Beispiel:
<?php
$strLangerString = 'Das ist aber ein langer String....';
echo countchars(&$strLangerString, 'a')."<br/>\r\n";
echo $strLangerString;
function countchars($argStrHaystack, $needle)
{
$argStrHaystack .= ' und er wird noch länger';
return preg_match_all('/'.$needle.'/',
$argStrHaystack, $arrDummy);
}
?>
Zusätzlich zum Zeichenzählen fügt die Funktion an die ihr übergebene Variable noch einen Text an. Das echo $strLangerString; zeigt diese Verlängerung mit an. Gegenprobe: Entfernen Sie das & bei der Parameterübergabe in der Funktion - schon bleibt die Verlängerung aus.
Bedingungen für die Kommentareingabe
Hinweis
Add to Del.icio.us