AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Fehler bei php.net melden?

Ein Thema von himitsu · begonnen am 8. Aug 2010 · letzter Beitrag vom 20. Aug 2010
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.100 Beiträge
 
Delphi 12 Athens
 
#1

Fehler bei php.net melden?

  Alt 8. Aug 2010, 14:38
Mir ist grade ein Fehler in PHP 5 aufgefallen.
(dachte erst das liegt an meinem Code und ich hab alles seit gestern umgegraben und sonstwo gesucht und getestet)

Hab das jetzt alles auf diesen Code zusammengeschrumpft,
PHP-Quellcode:
<?php
  $arr = array('one', 'two', 'tree', 'four', 'five');
  foreach ($arr as &$str) $str = machwas($str);
  foreach ($arr as $str) echo $str;
?>
welches als Ergebnis "one two tree four four" liefert

hierbei ändert sich bei jedem Schritt der letzte Array-Eintrag.
PHP-Quellcode:
<?php
  echo '<pre>';
  $arr = array(' one ', ' two ', ' tree ', ' four ', ' five ');
  print_r($arr);
  echo "\n";
  foreach ($arr as &$str)
    $str = trim($str);
  foreach ($arr as $str) {
    print_r($arr);
    echo "\n$str\n\n";
  }
  print_r($arr);
?>

So, hatte das jetzt erstmal hier gepostet:
http://www.php.net/manual/de/control...each.php#99280

und hab nun auch die Bug-Abteilung gefunden.
jetzt suche ich aber schon 'ne Weile viele Einträge ab, ob die was mit meinem Problem zu tun haben und hab noch Unmassen vor mir, da ich auch nicht genau weiß nach was ich suchen soll.

Kennt schon jemand das Problem oder hat dazu schon einen Eintrag entdeckt?


Ach ja: Selber hab'sch das in PHP 5.2.4 und 5.3.0 reproduzieren können.


[add]
und nun hab'sch och den Grund für die Änderung (aber k.A. auf was die Referenz zeigt)
PHP-Quellcode:
$arr = array(' one ', ' two ', ' tree ', ' four ', ' five ');
foreach ($arr as &$str) $str = trim($str);
var_dump($arr);
Code:
array(5) {
  [0]=> string(3) "one"
  [1]=> string(3) "two"
  [2]=> string(4) "tree"
  [3]=> string(4) "four"
  [4]=> &string(4) "five"
}
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Aug 2010 um 15:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Fehler bei php.net melden?

  Alt 8. Aug 2010, 16:04
ganz ehrlich sehe ich das nicht als bug an das kuddelmuttel entsteht wenn bei einer foreach schleife die Variable geändert wird durch welche iteriert wird.
[Edit]
Ich nehms zurück, hab irgendwie schief hin geschaut - sorry
Aber um ehrlich zu sein ist mir rätselhaft warum du vor deiner Schleifenvariablen ein & platzierst. Was willst du eigentlich damit bewirken?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's

Geändert von SirThornberry ( 8. Aug 2010 um 16:09 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Fehler bei php.net melden?

  Alt 8. Aug 2010, 16:07
Eher die Tatsache, dass mann das kann
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.100 Beiträge
 
Delphi 12 Athens
 
#4

AW: Fehler bei php.net melden?

  Alt 8. Aug 2010, 16:09
Aber diese Möglichkeit eines änderbaren Values ist offiziell von denen vorgeschlagen und genau auf php.net hatte ich dieses auch mal irgendwo gefunden und fand es eigentlich recht praktisch.

Zitat:
As of PHP 5, you can easily modify array's elements by preceding $value with &. This will assign reference instead of copying the value.
Aber danke dafür, daß du mich für dieses Zitat nochmal hast nachsehn lassen ... hab grade einen Hinweis mit "unset" gefunden (komisch, der war mir bis eben noch garnicht aufgefallen ) ... mal sehn ob der hilft.
http://www.php.net/manual/de/control...each.php#99280

[edit]
Ein unset($str); nach der Schleife hilft wirklich
Na gut, dann werd ich mal alle forschleifen abgrasen und das einfügen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Aug 2010 um 16:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Fehler bei php.net melden?

  Alt 8. Aug 2010, 16:18
wieder was gelernt. Ich wusste bis eben nicht das es möglich ist auf diese Art und Weise die Variable zu ändern welche durch iteriert wird.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Fehler bei php.net melden?

  Alt 8. Aug 2010, 16:19
Führt auch zur Verwirrung. Ich würde von dieser Möglichkeit besser Abstand nehmen
Markus Kinzler
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Fehler bei php.net melden?

  Alt 8. Aug 2010, 17:27
hm. Ich sah das bisher immer als gewissen Performance-Vorteil. Dürfte doch wohl leichter sein, "nur" den Pointer weiterzuschieben, als immer gleich den gesamten Record zu kopieren. Ich habe viele foreach-Schleifen so aufgebaut, auch wenn ich den Wert gear nicht verändere.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.100 Beiträge
 
Delphi 12 Athens
 
#8

AW: Fehler bei php.net melden?

  Alt 8. Aug 2010, 18:03
Bei Strings und Objekten handelt PHP das ja anscheinend sowieso schon als referenzzählende Zeiger.

Aber vorallem beim Ändern fand/finde ich es von Vorteil, daß man direkt auf den Wert zugreifen kann und nicht jedesmal wieder über das Ursprungsobjekt/-array gehn zu, wo dann der Wert ja erneut gesucht werden müßte.

foreach ($this->Parent->Files as $File)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Aug 2010 um 18:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#9

AW: Fehler bei php.net melden?

  Alt 8. Aug 2010, 21:34
Normalerweise kannst du die Bugs direkt unter http://bugs.php.net melden. Ich werd das morgen aber nochmal bei ein paar PHP-Group-nahen Arbeitskollegen zur Sprache bringen.

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#10

AW: Fehler bei php.net melden?

  Alt 11. Aug 2010, 06:31
Hier mal die Antwort eines PHP-Entwicklers (also Entwickler am Core). Ich hab ihm diesen Beispielcode geschickt:
PHP-Quellcode:
$array = array(' one ', ' two ', ' three ', ' four ', ' five ');
foreach ($array as &$str) $str = trim($str);
foreach ($array as $str) echo $str;
Zitat:
[12:03]<anonym>: foreach ($arr as &$str) {
[12:04]<anonym>: du iterierst über das array, bei jedem iterationsschritt machst du $str zu einer referenz auf das aktuelle element.
[12:04]<anonym>: Eine Referez in PHP ist ein Alias, d.h. alle Referenzen sind 100% gleichberechtigt.
[12:05]<anonym>: nun is die iteration zu ende.
[12:05]<anonym>: Was is die Situation?
[12:05]<anonym>: $str is eine Referenz auf das letzte element im Array.
[12:05]<anonym>: Klar.
[12:05]<anonym>: Also geht es weiter:
[12:05]<anonym>: #
[12:05]<anonym>: foreach ($arr as $str) {
[12:06]<anonym>: wir iterieren wieder und weise bei jedem schritt $str das aktuelle element zu.
[12:06]<anonym>: $str ist aber eine Referenz auf das letzte element im Array.
[12:07]<anonym>: d.h. wenn wir im ersten schritt der zweiten Iteration das erste Element aus dem Array nehmen und $str zuweisen ändert sich zugleich dasletzte element im array
[12:07]<anonym>: das schaut also wie array(' one ', ' two ', ' three ', ' four ', 'one') aus
[12:07]<anonym>: im nächsten schritt weisen wir dem letzten element dem letzten zu
[12:07]<anonym>: ...
[12:08]<anonym>: im vorletzten schritt weisen wir dem letzten element das vorletzte element zu
[12:08]<anonym>: array(' one ', ' two ', ' three ', ' four ', ' four ')
[12:08]<anonym>: und im letzten schritt das letzte dem letzten, also ändert sich nichts
[12:09]<anonym>: kannst du auch beobachten indem du ein print_r($arr) in die zweite iteration packst
[12:09]<anonym>: Don't use references and be happy.
[12:10]<anonym>: Alles klar?
Alles klar?

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz