Ve starších verzích PHP bylo možné předávat do funkce call_user_func()
paramtery pomocí reference.
To se dá využít například k tomu, že si uděláte třídu pro zpracování událostí. Metodou add()
si při bootstrapu zaregistrujete callback funkce. A v příslušném místě pak pomocí metody emit()
vyvoláte všechny zaregistrované callbacky a předáte jim data. Každá vyvolaná funkce (metoda) může data zpracovat a zmodifikovat. Ideální řešení pro tuto situaci je právě předání dat pomocí reference.
Velice jednoduchá implementace třídy Event
by mohla vypadat takhle nějak:
final class Event {
private static $events = array();
public static function bootstrap() {
static $bootstrap_done = FALSE;
if($bootstrap_done == TRUE) {
return;
}
foreach(glob(HOOKS_DIR.'/*') as $hook) {
include_once($hook);
}
$bootstrap_done = TRUE;
}
/**
* register new event callback
*/
public static function add($event, $callback) {
if(empty($event) || empty($callback)) {
return FALSE;
}
if(empty(self::$events[$event])) { // new event - create empty callback field
self::$events[$event] = array();
}
if(!in_array($callback,self::$events[$event], TRUE)) {
self::$events[$event][] = $callback;
}
}
/**
* run registered event callback
*/
public static function emit($event, &$data = NULL) {
if(!empty(self::$events[$event])) {
foreach(self::$events[$event] as $e) {
call_user_func($e,&$data);
}
}
}
}
Tato implementace by šla použít do verze PHP 5.1 od PHP 5.2 je konstrukce:
call_user_func($e,&$data);
označena jako deprecated a musíte použít místo toho následující volání.
call_user_func_array($e,array(&$data));
Mohl bych poprosit někoho o nějaký příklad použití této třídy?
Poslat nový komentář