předání reference do call_user_func()

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));

Komentáře

Mohl bych poprosit někoho o nějaký příklad použití této třídy?

Poslat nový komentář

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.