Mailinglisten-Archive |
Till Gerken wrote: > Genau das war meine Frage. :) Die Funktionen ohne _ex basteln bei mit > Referenzen übergebenen Parametern rum, indem sie die übergebenen Werte > zuerst auf neue Speicherbereiche kopieren. Johann-Peter Hartmann vermutete, > daß dies evtl. deswegen passiert, um die Variablen gegen versehentliche > Änderungen zu schützen... ich habe das noch nicht überprüft, hört sich aber > durchaus schlüssig an, da die neu erstellten Kopien der Variablen nichts > mehr mit dem Original zu tun haben. Bleibt die Frage, ob bei einem > Funktionsaufruf alle Variablen, die _nicht_ via Referenzen übergeben werden, > automatisch auf temporäre Kopien gelagert werden. Hallo Till, hallo Johann-Peter, ich kann nachvollziehen, daß getParameters() zur Sicherheit Kopien erstellt. Die Funktionalität hat getParametersEx() nicht. In der neuen API übernimmt convert_to_[long|...]_ex diese Aufgabe. Es bleibt die Frage, wie mit Variablen umgegangen wird, die nicht via Referenz übergeben werden. Wenn Du getParameters() benutzt wird kopiert, bei getParametersEx() nicht. Ich habe mir mal eine neue auf Zend optimierte Funktion geschnappt, wie array_merge aus standard/array.c . Hier wird getParametersEx aber keine convert_to_[long|...]_ex benutzt. In dieser PHP Funktion wird nur die Zend API aufgerufen. Die Funktion wird nicht durch das resourcenaufwendige, zwangsweise Kopieren von Argumenten durch getParameters() aufgehalten. PHP Funktionen, die selbst mit den Argumenten arbeiten wollen, müssen (sollten...) eine der convert_to_[long|...]_ex Funktionen benutzen, um aus dem struct die Daten in der gewünschten Form zu isolieren. Wohl aus Sicherheitsgründen werden die Daten vorher kopiert, aber nur dann, wenn unbedingt notwendig. Wann genau wird kopiert? Ich spiel mal Parser bei convert_to_long_ex: if ((*ppzv)->type!=IS_LONG) { if (!(*ppzv)->is_ref) { zval *orig_ptr = *(ppzv); if (orig_ptr->refcount>1) { [...KOPIEREN...] } } Es wird kopiert, wenn der Typ nicht stimmt und es keine Referenz (Sicherheitskopie) ist, richtig? Für mich sieht es so aus, als habe man eine resourcenfressende Aufgabe sinnvoll verlagert und zögert die Kopie so weit wie möglich raus. Ulf -- Ulf Wendel NetUSE Kommunikationstechnologie GmbH Siemenswall, D-24107 Kiel, Germany Fon: +49 431 386435 00 -- Fax: +49 431 386435 99
php::bar PHP Wiki - Listenarchive