phpbar.de logo

Mailinglisten-Archive

[php] Performancegewinn durch Referenzen

[php] Performancegewinn durch Referenzen

Johannes Schlueter schlueter at phpbar.de
Fre Mai 28 15:10:25 CEST 2004


Hi Peter,

On Friday 28 May 2004 14:38, Peter Bieling wrote:
> da das Thema gerade aktuell ist, mal eine allgemeine Frage zu
> Referenzen. Bisher habe ich die in PHP noch nicht weiter verwendet,
> daher mal ganz naiv gefragt:
> Gibt es messbare Vorteile durch den Einsatz von Referenzen?

In der Geschwindigkeit ist ein Aufruf per Referenz ist bei einem 
durchschnittlichen Objekt (oder auch einem anderen Datentyp) nicht wirklich 
anders als das kopieren.
Bei "normalen" Variablen ist ein Call-by-value, also Kopieren der Variablen, 
auch sinniger. Wenn ich sowas habe:
<?php
$a = 1;
echo my_function($a);
?>
Will ich in der my_function ja in der Regel den Wert $a verarbeiten:
<?php
function my_function($param) {
  $param += 23;
  return $param;
}
?>
Da sollte das originale $a nicht verändert werden. Bei Objekten will man 
hingegen die Methoden des selben aufrufen und die sllen dann häufigauch auf 
dem Objekt arbeiten und es - wenn nötig auch verändern.

> Ab welcher Größenordnung wirkt sich das überhaupt aus und warum macht

Muss schon rehct groß sein....

> das PHP nicht automatisch per Referenz, wenn der Referenzaufruf
> sinnvoller ist?

Weil mit der ZendEngine1, also PHP4, ein Objekt eine ganznormale Variable ist 
die sich intern im Grundsätzlichen kaum von einem anderen Datentyp 
unterscheidet. Was zu so kuriosen Dingen führt, dass selbst
<?php
$objekt = new myClass();
?>
Eine Kopie des frisch erstellten Objektes erstellt.

Mit der ZE2, also PHP5, wird das alles besser. Da sind Objekte intern 
(vereinfacht dargestellt) nur Zeiger auf das, getrennt von der Variable 
gespeicherte Objekt.Wenn ich da somit die Variable kopiere zeigt die 
immenroch auf die selbe interne Datenstruktur, wodurch es so wirkt als ob das 
Referenziert werden würde.

<?php
class meineKlasse {
    var $val;

    function meineKlasse($wert) {
        $this->val = $wert;
    }
}

function changeWert($o) {
    $o->val='bar';
}

$objekt = new meineKlasse('foo');
changeWert($objekt);
echo $objekt->val;
?>

Gibt z.B. mit PHP4 "foo" aus, wohingegen es mit PHP5 "bar" ausgibt.
Letzteres ist man aus anderen Sprahcen gewohnt und macht wohl auch mehr 
Sinn ;-)

johannes

php::bar PHP Wiki   -   Listenarchive