<?php
// basic output function
function dump($o) {
echo nl2br(str_replace(' ',' ',print_r($o,1))).'<br/><br/>';
}
class Store extends EventDriven {
// Speicher zum Überladen
protected $store = array();
// Events
protected $onBeforeSet;
protected $onAfterSet;
protected $onErrorSet;
// Event-Handling Events =)
protected $onBeforeSetHandler;
protected $onAfterSetHandler;
protected $onErrorSetHandler;
// Standard-Handler setzen
public function __construct() {
$this->on('beforeSet', array($this,'h'))->on('afterSet',array($this,'a'));
}
// Event-gestütztes Overloading
public function __set($name, $value) {
try {
// Prüfevent
$this->trigger('beforeSet',$this,$name,$value);
// Aktion
$this->store[$name]=$value;
// Ergebnis-Event
// sollte zwar keine Exceptions werfen aber, sicher ist sicher
// z.B. zum Loggen
$this->trigger('afterSet',$this,$name,$value);
} catch (Exception $e) {
// Fehler-Event
$this->trigger('errorSet',$this,$e,$name,$value);
};
}
// BeforeSet-Handler
protected function h ($me,$k,$v) {
dump("h Trying to set '$k' to '$v'");
}
// AfterSet-Handler
protected function a () {
dump("a Property set.");
}
// Überschriebene event-Setzung
// z.B. um bestimmte events auszuschließen o.Ä.
// grundfunktionalität sollte weiterhin bleiben
public function on($event, $cb, $overwrite = false) {
try {
// Prüfevent
$this->trigger('beforeSetHandler',$this,$event,$cb,$overwrite);
// Aktion
parent::on($event, $cb, $overwrite);
// Ergebnis-Event
$this->trigger('afterSetHandler',$this,$event,$cb,$overwrite);
} catch (Exception $e) {
// Fehler-Event
$this->trigger('errorSetHandler', $this,$e,$event,$cb,$overwrite);
}
return $this;
}
} // end of example class
// usage
$o = new Store();
dump('<h1>Event Test Suite</h1>');
dump('This suite shall be the first step in PHP\'s event handled programming.');
dump('<h2>Using this object:</h2>');
dump($o);
dump('<h2>Trying to set an undefined property...</h2>');
$o->test = 123;
dump('<h2>Result</h2>');
dump($o);
dump('<h2>Adding some Event-Handlers...</h2>');
$o->on('afterSetHandler',function(EventDriven $me,$event,$cb,$ow){
static $c = 0;
dump("0: $event ".($ow?"replaced.":"added").'. '.$c++);
})->on('beforeSet',function(EventDriven $me,$k,$v){
dump ("1: Property '$k' not found. Trying to overload...");
})->on('afterSet',function(EventDriven $me,$k,$v){
dump("2: Overloaded. You have set '$k' to '$v'");
},1)->on('errorSet',function(EventDriven $me,Exception $e) {
dump($e->getMessage());
dump('3: Canceled.');
})->on('beforeSet',function(EventDriven $me, $name){
if($name == 'notAllowedProperty') throw new Exception ("4: Property <em>$name</em> not allowed.");
});
dump('<h2>What happens now?</h2>');
$o->toast = 456;
dump('');
$o->notAllowedProperty = 'At least I tried.';
dump('<h2>The altered object</h2>');
dump($o);
|