![]() |
AW: Fehler bei php.net melden?
So in etwa hab ich diese Auswirkung inzwischen auch mitbekommen.
Mit var_dump, statt print_r (hatte sonst auch immer print_r genommen) sieht man auch noch diese Referenz. Man könnte ja nun auch fragen, warum PHP nicht am Ende der Schleife diese Referenz selber freigibt. :evil: (soviel zu Managed-Umgebungen :shock: ) |
AW: Fehler bei php.net melden?
Weil PHP nicht das Denken für dich übernimmt. Die Zählvariable am Ende einer Schleife freizugeben gehört IMHO nicht in den Aufgabenbereich des Script-Interpreters. Ich hatte schon ab und zu mal Fälle, in denen ich die Variable danach noch gebraucht habe.
Liebe Grüße, Valle |
AW: Fehler bei php.net melden?
Nein, das muß es ja nicht, aber wenn PHP dort eine Referenz einfügt, welche vorher nicht da war, dann sollte es diese auch selber wieder entfernen.
Ist doch wie im Delphi. > der, wer etwas erstellt, der sollte es auch wieder freigeben |
AW: Fehler bei php.net melden?
Du hast doch selbst den Code geschrieben und PHP dazu angewiesen eine Referenz anstatt einer Kopie zu benutzen. Der Interpreter macht genau das, was du ihm gesagt hast. Auch an dieser Stelle muss ich PHP mal in Schutz nehmen, denn es ist völlig logisches und absehbares Verhalten.
Liebe Grüße, Valle |
AW: Fehler bei php.net melden?
Lesen und fuer immer merken:
Zitat:
Wenn du sowas machst:
PHP-Quellcode:
Dann darfst du nicht erwarten, dass $i nicht als Referenz benutzt wird.
$i = &$blah;
for ($array as $i => $str) doSomething(); Das Reference-Konzept von PHP ist bisserl eigenartig, umso wichtiger ist es dass man es versteht bevor man es verwendet. Ich kann dir wirklich nur den Satz von oben erwaehntem Entwickler ans Herz legen. Der Herr arbeitet seit 10 Jahren mit PHP und ist im Core-Team - wenn der sowas sagt dann ist da was dran. Greetz alcaeus |
AW: Fehler bei php.net melden?
Glueckwunsch - dein Code hats auf den Blog von besagtem Entwickler geschafft, da auch mit einer sehr ausfuehrlichen Erklaerung:
![]() Greetz alcaeus |
AW: Fehler bei php.net melden?
Würde PHP aber am Ende der Schleife die Referenz wieder auflösen/entfernen, dann gäbe es dieses "Problemchen" doch aber garnicht?
|
AW: Fehler bei php.net melden?
Ich sehe das genau so. Da hat jemand einen Fehler gebaut und schiebt die Schuld auf irgendwelche Umstände anstelle das der Fehler am Ursprung entfernt wird.
Zumindest ich kenne spontan keinen Fall bei dem man das aktuelle Verhalten haben will. Hingegen kenne ich nur Fälle in dem man genau das Gegenteil will. Es macht aus meiner Sicht keinen Sinn das man etwas hinschreiben muss ohne das es gar nicht geht. Für mich ist es so als ob man bei Delphi hinter jede Anweisung noch "do" schreiben müsste (und wenn man es nicht macht passiert irgend etwas ganz anderes als die Anweisung mit "do" bewirkt). |
AW: Fehler bei php.net melden?
Wenn du das Konstrukt auseinanderdroeselst, dann weisst du nicht mehr dass du in einer Schleife die Zuweisung hattest. Der einzige Fehler den ich da sehe ist die Moeglichkeit, in der Schleife die "Laufvariable" als Referenz zu verwenden. Der Rest macht absolut Sinn. Es waere mindestens genauso falsch, die Referenz nach der Schleife zu killen, v.a. da das sonst nirgends in PHP moeglich ist. Verwende ich in einer Funktion eine Variable dann kann ich die von da an immer benutzen. Eine Variable nur im Schleifenkontext zu erstellen ist in PHP nicht moeglich.
Noch ein Beispiel:
PHP-Quellcode:
Wenn mir PHP nun die Referenz unterm Arsch wegziehen wuerde, waere das ein sehr ungewohntes Verhalten. Ich gehe davon aus, dass ich in $baz die Referenz zum zuletzt bearbeiteten Array-Element habe, genauso wie ich nach dieser Schleife einen bestimmten Wert fuer $i erwarte:
foreach ($foo as $bar => &$baz) {
if (someCondition()) { break; } } $baz->doSomething();
PHP-Quellcode:
Greetz
for ($i = 0; $i < $someCount; $i++)
alcaeus |
AW: Fehler bei php.net melden?
Man kann da notfalls auch einfach den Wert kopieren und damit die Referenz ersetzen.
Aber wer nutzt schon eine Schleifenvariable außerhalb der Schleife? (ein Delphianer lernt/macht sowas jedenfalls nicht :zwinker: ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz