Guten Morgen
Ich hab mir heute mal darüber Gedanken gemacht, wie man Events in PHP bauen könnte. Natürlich gibt es schon viele Umsetzungen in etlichen Frameworks (PEAR, ...). Ich würde euch gern meine Umsetzung zeigen und wissen, wie ihr die findet.
Der Eventhandler selbst:
Der EventHandler im Einsatz:
Die Ausgabe:
Ich selbst find die ganze sache SEHR nice, Objekte können somit miteinander kommunizieren, ohne dass sie voneinander wissen
nja, das wars auch schon,
Mfg Fips.
Ich hab mir heute mal darüber Gedanken gemacht, wie man Events in PHP bauen könnte. Natürlich gibt es schon viele Umsetzungen in etlichen Frameworks (PEAR, ...). Ich würde euch gern meine Umsetzung zeigen und wissen, wie ihr die findet.
Der Eventhandler selbst:
PHP-Code:
<?php
class EventHandler {
const REGEX_VALID_EVENT_NAME = '/^[a-zA-Z][a-zA-Z0-9]*$/';
private $arr_events = array();
public function addEvent($pstr_event, $pcb_callback) {
if ( is_callable($pcb_callback) !== true ) {
throw new InvalidArgumentException(
'Der angegebene Callback ist nicht gültig!');
}
if ( !is_string($pstr_event)
OR preg_match(self::REGEX_VALID_EVENT_NAME, $pstr_event) === 0 ) {
throw new InvalidArgumentException(
'Der angegebene Eventname ist ungültig!');
}
$this->arr_events[$pstr_event][] = $pcb_callback;
}
public function bindEvents(array $arr_events, $pcb_callback) {
foreach ( $arr_events as $str_event ) {
$this->addEvent($str_event, $pcb_callback);
}
}
public function triggerEvent($pstr_event, $obj_subject = null, array $parr_params = array()) {
if ( is_string($pstr_event) ) {
if ( isset($this->arr_events[$pstr_event]) ) {
foreach ( $this->arr_events[$pstr_event] as $cb_callback ) {
$arr_params = array($obj_subject, $parr_params);
call_user_func_array($cb_callback, $arr_params);
}
}
} else {
throw new InvalidArgumentException(
'Eventname muss vom Datentyp "String" sein!');
}
}
}
?>
PHP-Code:
class Person {
private $str_name;
private $obj_eventhandler;
public function __construct($pobj_eventhandler, $pstr_name) {
$this->str_name = $pstr_name;
$this->obj_eventhandler = $pobj_eventhandler;
$this->obj_eventhandler->addEvent('onSpeak', array($this, 'listen'));
}
public function speak() {
echo $this->str_name . ' fragt: "Wer ist da?"<br />';
$this->obj_eventhandler->triggerEvent('onSpeak', $this);
}
public function listen($obj_subject, $parr_params) {
if ( $obj_subject !== $this ) {
echo $this->str_name . ' antwortet: "Ich!"<br />';
}
}
}
$obj_eventhandler = new EventHandler();
$obj_fips = new Person($obj_eventhandler, 'Fips');
$obj_alex = new Person($obj_eventhandler, 'Alex');
$obj_michi = new Person($obj_eventhandler, 'Michi');
$obj_sandra = new Person($obj_eventhandler, 'Sandra');
$obj_alexa = new Person($obj_eventhandler, 'Alexa');
$obj_fips->speak();
Code:
Fips fragt: "Wer ist da?" Alex antwortet: "Ich!" Michi antwortet: "Ich!" Sandra antwortet: "Ich!" Alexa antwortet: "Ich!"
nja, das wars auch schon,
Mfg Fips.
Kommentar