Moin!
Ich quäle mich grade durch die PHP8-Umstellung eines großen Projektes (von PHP7.4.33). Ich kann nachvollziehen, dass der Hinweis (E_NOTICE) für "undefined array key" auf eine Warnung (E_WARNING) hochgestuft wurde. Ich habe sogar tatsächlich deshalb Fehler im Code gefunden, die dort seit Jahren schlummerten (sie waren nicht wirklich schlimm, sonst wären sie ja schon vorher aufgefallen
). Aber, immerhin.
Nun gibt es aber Situationen, in denen will mir einfach nicht einleuchten, was daran nun "besser" sein soll. Konkret ärgere ich mich immer wieder bei Histogrammen, also dem Zählen der Häufigkeit unbekannter Werte. Hier ein simples Beispiel:
PHP-Quelltext
1: 2: 3: 4: 5: 6:
| $a = array('Apfel', 'Birne', 'Apfel'); $histo = array(); foreach ($a as $key) $histo[$key]++; var_dump($a); var_dump($histo); |
liefert erwartungsgemäß unter PHP8.x:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| Warning: Undefined array key "Apfel" in php8_count_demo.php on line 7 Warning: Undefined array key "Birne" in php8_count_demo.php on line 7
array(3) { [0]=> string(5) "Apfel" [1]=> string(5) "Birne" [2]=> string(5) "Apfel" } array(2) { ["Apfel"]=> int(2) ["Birne"]=> int(1) } |
Klar, man kann entweder einen Dual-Pass-Ansatz wählen und erst die Werte, dann die Häufigkeit ermitteln. Man kann auch bei jedem Wert schauen ob er schon existiert und dann alternativ den Wert mit 1 initialisieren oder sonst inkrementieren. Ist dann "sauberer" Code, aber weder performant noch besser lesbar.
Also, Fehler unterdrücken und sich jedesmal unwohl fühlen, weil das ja "unsauber" ist...
PHP-Quelltext
1: 2:
| foreach ($a as $key) @$histo[$key]++; |
Was mache ich falsch, was übersehe ich, ist das wirklich von den PHP-Entwicklern so beabsichtigt? Ich kann das irgendwie nicht glauben...
cu
Narses
There are 10 types of people - those who understand binary and those who don´t.