Moin!
In Manual steht das Funktionsnamen nur einmal vorkommen dürfen. Wenn man sich daran hält gibt es IMHO keine Probleme. Wenn ich Funktionen kapseln will verwende ich Klassen. Mit :: lassen sich die Funktionen ja auch aufrufen ohne die Klasse vorher zu instanzieren.
Das hatten wir auch eingehalten. Allerdings mochte PHP die "Kapselung" nicht. Hätte ja sowieso keine Wirkung gehabt. War ja nur der Schönheit des Quellcodes wegen.
Du willst etwas, was z.B. in TurboPascal/Delphi funktioniert: Lokale Funktionen (nicht nur lokale Variable).
PHP ist eine Skriptsprache. Code wird von oben nach unten abgearbeitet, ohne vorher kompiliert zu werden. Auch include() macht Probleme, wenn man es mehrfach aufruft, und im eingefügten Skript Funktionsdefinitionen vorkommen. Insofern ist das Include-Verhalten eigentlich schon übertragbar auf das Verhalten, wenn Funktionsdefinitionen innerhalb von aufgerufenen Funktionen stehen. Die Funktionsdefinition wird bei jedem Funktionsaufruf ausgeführt - genauso wie die Funktionsdefinition bei mehrfachem Include mehrfach ausgeführt wird.
Das Verhalten ist durchaus logisch. Dass du etwas anderes erwartet hättest, und dass es der Codeschönheit helfen würde, lokale Funktionen zu definieren, gilt nicht. ;) Als Bonus kriegst du dafür die Mächtigkeit von eval() und kannst zur Laufzeit neue Funktionen definieren, sofern es nötig ist (allerdings ist selbstmodifizierender Code durchaus eine ziemliche Ekligkeit, die man lieber vermeiden sollte).
- Sven Rautenberg
"Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)