Zend_Config_Ini, Arrays und die Vererbung
Ich mag .ini Konfigurationsdateien, und deshalb nutze ich auch bei Zend Framework Projekten immer die application.ini . Damals habe ich gelernt dass man Arrays so definiert:
[production] ... server.0 = 192.168.0.1 server.1 = 192.168.0.2 [development : production] … server.0 = 10.0.0.1 server.1 = 10.0.0.2
Im ZendFramework Code kann ich dann das server-Array so nutzen:
$serverArray = $applicationIni->server->toArray();
Funktioniert wunderbar, es werden alle Einstellungen der production Sektion geerbt und ich habe in der Entwicklungsumgebung andere Server als in der Produktionsumgebung. Ein Problem tritt erst auf wenn ich in der Entwicklungsumgebung weniger Server habe als in der Produktionsumgebung:
[production] … server.0 = 192.168.0.1 server.1 = 192.168.0.2 [development : production] … server.0 = 10.0.0.1
Durch die Vererbungsregeln überschreibe ich also server.0, aber server.1 wird aus der production Sektion übernommen, das will ich aber nicht!
Meine bisherige Lösung sah so aus:
[production] … server.0 = 192.168.0.1 server.1 = 192.168.0.2 [development : production] … server.0 = 10.0.0.1 server.1 =
Und im PHP Code habe ich dann das Array auf leere Elemente untersucht, die ich dann übersprungen habe. Problem gelöst.
Nun bin ich durch Zufall auf eine bessere Lösung gestossen. In einem Kommentar der parse_ini_file() Funkion wurde sie 2007 erwähnt, worauf sie dann später auch im Manual aufgenommen wurde:
[production] … server[] = 192.168.0.1 server[] = 192.168.0.2 [development : production] … server[] = 10.0.0.1
Diese Lösung ist deutlich schöner und effektiver, ich brauche im PHP-Code nicht mehr auf leere Array-Elemente testen, ich bekomme direkt das Array das ich erwarte. Leider weiß ich nicht ab welcher PHP-Version diese eckigen Klammern nutzbar sind, es ist ein schönes Feature, das einem etwas Mehrarbeit und unschöne ini-Dateien ersparen kann. Ich wußte das jedenfalls noch nicht, und es ist gut möglich dass es für euch ein alter Hut ist.