Regina Schaukrug: Ergänzend zu: Array-/Variableninitialisierung bei PHP

Beitrag lesen

In PHP erhalte ich aber bspw einen Fehler bei dem Code

$category['reporting']['period']['categorySum'] += $iCode['pi']['period']['sum'];

(Umgebaut:)

<?php
$category['reporting']['period']['categorySum'] += 1;
echo '$category[\'reporting\'][\'period\'][\'categorySum\'] ist jetzt: ' . $category['reporting']['period']['categorySum'] . "\n";

Ausgaben in einem Terminal:

~$ php /tmp/test.php
PHP Notice:  Undefined variable: category in /tmp/test.php on line 2
PHP Notice:  Undefined index: reporting in /tmp/test.php on line 2
PHP Notice:  Undefined index: period in /tmp/test.php on line 2
PHP Notice:  Undefined index: categorySum in /tmp/test.php on line 2
$category['reporting']['period']['categorySum'] ist jetzt: 1

Ergänzend: Das ist formal kein "Fehler" sondern nur eine "Notiz". Fehler führen zum Abbruch. Die "Notizen" benachrichtigen in diesem Fall darüber, dass PHP zur Vermeidung eines Abbruchs spekuliert hat - was eine Programmiersprache meinem Verständnis von "Programm" nach nie tun sollte. Wie oben zu sehen ist wirft PHP sogar bis zu 4 Notizen. Allerdings gilt es unter Programmieren aus gutem Grund (Vermeidung der extrem schwer zu findenden logischen Fehler) als zwingend diese Notizen zu vermeiden. Hier durch Instanzierung des named arrays und seiner Elemente an geeigneter Stelle.

if ( ! isset( $array['element'] ) ) {
   $array[element] = 0;
}

wäre also womöglich (abhängig von der Aufgabe) ein richtiger Weg.

Andere, auch nicht ganz dumme, Programmierer meinen, dass es erlaubt und klug sei, Stellen, an denen solche Notizen erwartet würden, mit einem vorangestellten @ zu beginnen um die Notiz zu vermeiden:

<?php
@$category['reporting']['period']['categorySum'] += 1;
echo '$category[\'reporting\'][\'period\'][\'categorySum\'] ist jetzt: ' . $category['reporting']['period']['categorySum'] . "\n";
?>

Ausgaben in einem Terminal:

~$ php /tmp/test.php
$category['reporting']['period']['categorySum'] ist jetzt: 1

Das macht aber die Fehlersuche schwieriger.