![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
Projektleiter
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
|
Hi,
ich überlege aktuell, wie man Closures in PHP realisieren könnte. (Kurzdefinition für Closure: Anonyme Funktion, die Zugriff auf den Scope (d.h. Variablen & Funktionen) hat, in dem sie definiert wurde) Das darf von mir aus 100 Zeilen PHP-Code involvieren und extrem repetitiv sein, Hauptsache ich krieg's irgendwie hin. Mein bisheriger Ansatz sieht so aus: PHP-Code:
Problematisch wird es aber schon, wenn ich eine Closure zurückgeben will oder einer Funktion übergebe, die sie nicht direkt ausführt (dadurch wird der Stack geleert, ohne das die Closure Zugriff darauf hatte). Hat jemand ne Idee, wie ich das Problem lösen kann? Oder gibt es keine Lösung (auch die Antwort würde mir helfen, weil ich dann nicht weiter überlegen müsste)? Danke - Patrick |
|
|
|
|
|
Nach oben #2 |
|
Erfahrener Benutzer
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
|
Ähm, also ich habe mal eben versucht mir anhand des Textes bei Wikipedia anzueignen, was es mit dem closure aufsich haben soll, aber ehrlichgesagt habe ich denn Sinn und Zweck nicht wirklich hinterblicken können. Was wäre ein sinnvoller Anwendungsbereich für soetwas?! Und die Klasse da oben verstehe ich auch gerade nicht so richtig. Was sollen die Methoden bringen? Wie sollen sie aufgerufen werden? Und wenn ich das gerade richtig überflogen habe würde der Stack mit jedem Aufruf von ____closure($n) um ein weiteres Element erweitert, wobei vom vorherigen alle Inhalte plus den Übergabeparameter in den Stack geschrieben werden!? Das würde dann aber verdammt viel Speicherverbrauch bedeuten für immer die gleichen Daten?! *kratzamkopf*
Ich versuche nochmal diese kurze aber irgendwie doch wirre Klasse zu verstehen und den Sinn zu hinterblicken, wobei mir das momentan äußerst schwer fällt, nicht zuletzt, weil ich den Sinn hinter der Funktionalität von closures nicht verstanden habe, vielleicht kann mir da jemand auf die Sprünge helfen!? Die Beispiele bei Wikipedia helfen leider nicht wirklich weiter...
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
|
|
|
|
|
Nach oben #3 |
|
Projektleiter
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
|
Hmm ja okay. In meinem Fall möchte ich eine Möglichkeit haben, um eine Callback-Funktion zu erzeugen, die Zugriff auf lokale Variablen und alle Methoden der Klasse, in der sie definiert wurde, hat.
Sinn macht das z.B. in Kooperation mit array_map und array_reduce. Einfaches Beispiel in PHP: PHP-Code:
Wenn dir das beim Verständnis hilft, kann ich dir gern eine genauere Erklärung meiner Motivation geben, aber ich weise mal vorsichtig darauf hin, dass das etwas umfangreicher werden könnte. Davon ab habe ich einen Alternativen Ansatz gefunden, der in vielen Bereichen besser funktioniert, aber streikt, wenn ich private/protected Methoden aufrufen will (kurz: Ich erzeuge eine weitere Klasse, die den state speichert und zur Verfügung stellt, dann bin ich aber nicht mehr in der Original-Klasse, habe also keinen Zugriff auf private Methoden). Java bietet via Reflection-API die Möglichkeit, auch private Methoden auszuführen. Kann PHP das auch? |
|
|
|
|
|
Nach oben #4 | |
|
BIN EIN KRASSA HELD!!!111
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.184
|
Zitat:
Ob sie das kann weis ich nicht. |
|
|
|
|
|
|
Nach oben #5 | |
|
Projektleiter
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
|
Zitat:
|
|
|
|
|
|
|
Nach oben #7 | |
|
Erfahrener Benutzer
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 662
|
Zitat:
PHP-Code:
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
|
|
|
|
|
|
Nach oben #8 |
|
Projektleiter
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
|
Was passiert bei Rekursion? Was ist, wenn zwei Funktionen einen Parameter mit gleichem Namen haben (wobei das das geringere Problem ist, den Namen kann ich ja generieren, so dass der jeweils anders ist)?
Ich mach's kurz und schmerzlos: Ich habe eine funktionale Template-/Programmiersprache, die ich nach PHP kompiliere. Closures wäre ein extrem nützliches Feature, dass ich gern implementieren würde. Die Implementation muss aber generisch sein (d.h. ich muss sie generieren können, ohne irgendwas anpassen zu müssen) und sollte möglichst effizient sein. Von daher geh ich davon aus, dass ich den Kompromiss mit "nur öffentliche Methoden" wählen werde oder das Feature ganz draußen lasse. Danke für die Hilfe. |
|
|
|
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| PHP 5.2 Kompilierung schlägt fehl | Byrel | Tools, Server, Betriebssysteme | 0 | 03.11.2006 21:09 |
| [Rezension] PHP 5 Kochbuch | Artemis | Literatur | 2 | 07.09.2006 19:15 |
| PHP 5.1.5, PHP 4.4.4 und PHP 5.2.0 RC2 veröffentlicht | Ben | Nachrichten | 2 | 01.09.2006 16:05 |
| PHP 5.1 ist drausen | robo47 | Nachrichten | 5 | 28.11.2005 20:30 |
| Neue PHP "release candidates": PHP 4.4.2 RC 1 und PHP 5.1 RC 6 | Ben | Nachrichten | 1 | 21.11.2005 20:48 |