hi,
Hallo,
Es kommt mir so vor, als würde hier auf ungeheuer komplizierte Art und Weise ein Designfehler von PHP ausgebügelt, nämlich dass es keine privaten Funktionen (also in Funktionen gekapselte Unterfunktionen) gibt. Die fehlen mir oft!
PHP ist eine Scheißsprache, ja, und mit dem Verstreuen von ein wenig funktionalem Zucker wird sie nicht angenehmer. ;)
Naja, das sagen viele zu Javascript auch und Crockford hat Recht: Du musst die good-parts nehmen. Zusammen mit den bad-parts ist JS "Scheiße".
Zu Arrays finde ich glaube ich aus der SPL (Standard PHP Library) das ArrayObject (http://www.php.net/manual/de/class.arrayobject.php).
Private Funktionen gibt es in prozeduralen, nicht funktionalen Sprachen höchstens in der Objektorientierung (Klassendeklarationen). Closures in PHP sollen weniger das Verschachteln von Funktionen ermöglichen, sondern andere Probleme umgehen:
- Die Standardbibliothek ist weder konsequent objektorientiert noch funktional, es gibt tausende globale Array-Funktionen anstelle einer Array-Klasse.
- Bei einer Array-Klasse würde Code üblicherweise im Scope der Instanz ausgeführt, Felix hätte also nicht das Verfügbarkeitsproblem.
- Bei funktionaler Definition der Sortierfunktion wäre es trivial, die Liste durchzuschleifen. Oder sie wäre über die Scope-Chain verfügbar.- Das schreckliche Angeben von Callback-Funktionen über ihren Namen als String. Jetzt sind *einige* Funktionen Objekte, andere müssen weiterhin über ihren Namen als String referenziert werden.
- Die schlechte Definition der Parameter von Callback-Funktionen. Würden die Callbacks der Sortierfunktionen z.B. die Signatur (a, b, array) haben, hätte Felix das Problem nicht. Closures sind hier eine weitere Lösungsmöglichkeit.
- Das schreckliche Erzeugen von Funktionen zur Laufzeit über Strings, nur um eine Flexibilität zu erreichen, die Closures und Funktionen als First-Class-Citizen ebenfalls mitbringen.
Solche Probleme hat man in anderen Sprachen nicht, die Lambdas oder zumindest Blöcke als integrales Sprachfeature haben.
s.a. https://forum.selfhtml.org/?t=217315&m=1492371
Irgendwie hat Felix das "Problem" doch aber lösen können, und hat sich irgendwie damit auch keinen abgebrochen. Javascript verfügt ja in dem Sinne garnicht über assoziative Arrays, sondern über Objekte. Ich weiß nicht, wie Du da eleganter oder besser ein Objekt
{"a":[],
"c" : "",
"d" : [];
"f" : ""
}
umsortieren würdest, dass erst die Einträge mit den Arrays kommen und dann die mit den Strings ... ???
mfg
tami