Moin!
Aber das hat nichts mit privaten Funktionen in Objekten zu tun - die existieren in PHP 5 selbstverständlich.
Das war mir schon klar.
Aber man kann nicht für jeden Datensatz, der aufgerufen wird, das gesamte Objekt neu instantiieren. Das würde dermaßen viel Speicher fressen, dass man keine Bildschirmseite vollbekommen würde.
Worauf willst du eigentlich hinaus? Datensatz - gesamtes Objekt - Speicher fressen? Hä? Sinn? Begründung?
Und für jede Funktion eine eigene Klasse schreiben?
Das ist doch auch irgendwo hirnrissig, oder?
Was stellst du dir da vor?
Du hast an irgendeiner Stelle in einer Methode einer Klasse die Notwendigkeit erkannt, dass sich wiederholender gleichartiger Code offenbar in einer Funktion besser aufgehoben ist. Also: Auslagerung des Codes in eine Funktion.
Nun soll die Funktion aber nicht der gesamten Welt zur Verfügung stehen. Also Auslagerung in eine private Methode des Objekts. Fertig.
Meinst du nicht, dass PHP so schlau ist, und den Code definierter Klassen nur einmal in den Speicher zu tun, und alle Datenbestandteile einer Instanz schön davon abgetrennt zu halten? Welchen Vorteil sollte es also haben, wenn man Funktionen auch innerhalb von Funktionen definieren könnte - außer dass der Zugriff der Funktionen, wenn man dem Vorbild von Pascal folgt, dadurch nicht nur eingeschränkt wäre auf lediglich die Methoden der Klasse, sondern sogar nur auf Aufrufe innerhalb der definierenden Methode.
Wenn das Argument lautet, dass man ja dadurch gewinnen würde, dass der Zugriff eben garantiert nur aus dieser einen definierenden Methode funktioniert - sorry, dann lautet das Gegenargument, dass es nicht sein kann, dass man sich selbst als Programmierer so schlecht im Griff hat, dass man sich nicht selbst kontrollieren kann, genau dieses eben auch mit einer privaten Methode nicht zu tun.
Oder dass es vermutlich ziemlicher Schwachsinn ist, sich in dieser Weise zu beschränken, da die separierte Funktion ja durchaus auch anderswo noch relevant sein dürfte - oder sie so winzig ist, dass es aus performancetechnischer Sicht eher unsinnig ist, den Overhead des Funktionsaufrufes in Kauf zu nehmen.
Das eigentliche Problem ist das "inhibit redeclare"
Das müsste man irgendwie ausschalten können für einzelne Funktionen.
Dann könnte man die zur Laufzeit beliebig oft überschreiben (über ihren Namen!) und gut wär's.
Es gibt in PHP ja Funktionen, die Funktionen löschen.
Hier geht es ja aber darum, dass PHP-Quellcode in einer DB stehen soll.
Wenn der nun durch ungeschickt gehwählte Relationen mehrfach geladen wird (mit eval()), dann kracht es.
Lass mal das OP-Problem außen vor. Darum geht es beim Thema "lokale Funktion" gar nicht.
"Cascading" oder Überladung wäre da schon angenehmer.
Wie meinen?
- Sven Rautenberg
--
"Love your nation - respect the others."