@mat:
Der ganze Post von dir (und ein paar der Posts davor) ist ziemlich unhöflich...
Das habe ich weder geschrieben noch gemeint.
Ich hab ehrlich gesagt versucht sachlich zu bleiben und mir deshalb den gesamten Thread noch einmal durchgelesen und hatte wohl den Eindruck, dass du HIER Senf draufgeben willst, wo keiner nötig ist. Zum Beispiel in diesem Post:
Wenn du Objekte übergibst sind das sowieso Referenzen seit PHP5. Also ich denk das is weniger problematisch für dein Event-System, mat
Find ich ja super, dass du dir Gedanken machst, aber ich habe ja viel zu wenig Informationen preisgegeben, um eine seriöse Antwort verlangen zu können. Ich wollte eigentlich nur meine Erfahrungen nach der Integration des neusten PHP-Updates hier teilen.
Ich schreib jetzt hier einfach was ich unter bubbling Events verstehe (btw. die .net Doku sagt mMn. das Gleiche):
Voraussetzung ist eine hierarchische Objektstruktur. Wird ein bubbling Event dort in einem Element ausgelöst, so wird (danach) das gleiche Event am Parent ausgelöst. So wird die gesamte Hierarchie "nach oben" bis zum Root durchlaufen falls das Bubbling nicht abgebrochen wird.
Die Analogie dabei sind in Flüssigkeit aufsteigende Bläschen.
Also. Was mich eigentlich interessiert. Um welchen Member geht es dir und warum macht der Probleme beim Bubbling bzw. falls wir nicht vom gleichen Bubbling reden halt bei deiner Methode der Event-Propagation?
Ich hab hier grad ein Projekt in Planung und das sollte eigentlich dann ungefähr so funktionieren wie in meinem Code...
Prinzipiell kommt es darauf an, wie den Code strukturiert werden soll. Ich brauche bei meinen Projekten eine strikte Trennung zwischen dem Basiscode des Frameworks und den Projekt-spezifischen Klassen. Damit wollte ich verhindern, dass Programmierer, die zukünftig mit einer Erweiterung des Projekts beauftragt werden, Einblick in den Framework-Code benötigen. Sie sollten nur den Ablauf, sowie eine Funktionsreferenz erhalten, um ihre eigenen Klassen auf Basis der zur Verfügung gestellten Framework-Klassen zu entwickeln. Die Einstiegspunkte für die Erweiterungen sind ausschließlich als überschriebene Funktionen in der neuen Klasse angelegte Events. zB:
class MyNewApplication extends Application
{
/**
* Invoked on every request to intialise the application.
*
* @return boolean application successfully initialised?
*/
protected function onInit()
{
// Initialise additional database connections
// ...
return true;
}
}
Das ist alles was gebraucht wird, um alle Initialisierungen für eine eigene Applikation zu machen. Praktisch, weil der Code wie gesagt komplett unabhängig vom restlichen Framework ist. Die Basisklassen bekommen ebenfalls das Event inkl. deren Kinder und Kindeskinder usw., wie es das Objekt selbst eben vorab deklariert hat - verkehrtes Bubbling halt.
Das ist natürlich noch ein einfaches Beispiel. Interessanter und für deine Frage auch relevant wird es, wenn das Event diverse Parameter mitbringt. Damit ein Objekt zum Beispiel auf diverse GET- und POST-Parameter eingehen kann, muss nur folgender Aufruf stattfinden:
/**
* Handles request parameters for this object
*
* @param array reference to request parameters
*
* @return boolean request parameters successfully handled?
*/
protected function onHandleRequest(&$aRequest)
{
if (array_key_exists('nForwardToID',$aRequest))
$this->forwardToID($aRequest['nForwardToID']);
return true;
}
Die Member-Funktion fowardToID() hat sich der Programmierer auch selber geschrieben und weiß bestens bescheid, wie diese handzuhaben ist. Die restlichen, für diesen Teil des Ablaufs relevanten Informationen werden als Parameter übergeben.
Natürlich könnte man diesen Teil auch ohne Funktions-Parameter mithilfe von Member-Variablen oder extern zugänglichen Funktionen implementieren. Das würde allerdings weit mehr Dokumentationsaufwand erfordern, weil der Programmierer ja stets wissen muss, welche Member-Variablen und -Funktionen ihm aus den abgeleiteten Basisklassen zur Verfügung stehen.