<?php
class EventArgs
{
public $handled = FALSE;
}
class Event
{
private $handlers = array();
public function __destruct()
{
$this->remove_all();
}
public function add($handler)
{
if (isset($handler) && is_callable($handler))
{
$this->handlers[] = $handler;
}
return $this;
}
public function remove($handler)
{
if (isset($handler) && is_callable($handler))
{
$i = NULL;
foreach ($this->handlers as $index => $f)
{
if ($f == $handler)
{
$i = $index;
break;
}
}
if (isset($i) && $i < count($this->handlers))
array_splice($this->handlers, $i, 1);
}
return $this;
}
public function remove_all()
{
array_splice($this->handlers, 0);
return $this;
}
public function trigger($sender, $args)
{
if(count($this->handlers) > 0)
{
foreach ($this->handlers as $f)
{
$f($sender, $args);
if ($args->handled) break;
}
}
}
}
$ev = new Event;
$sample = NULL;
echo "----------------\n";
function handler($sender, $args)
{
echo "Handler 1\n";
}
function handler2($sender, $args)
{
echo "Handler 2\n";
}
$ev->add(handler);
$ev->trigger($sample, new EventArgs);
echo "----------------\n";
$ev->add(handler2);
$ev->trigger($sample, new EventArgs);
echo "----------------\n";
function handler3($sender, $args)
{
echo "New handler\n";
}
$ev->remove(handler2);
$ev->add(handler3);
$ev->trigger($sample, new EventArgs);
echo "----------------\n";
function blocking_handler($sender, $args)
{
$args->handled = TRUE;
echo "Last handler\n";
}
function blocked($sender, $args)
{
echo "should not run\n";
}
$ev->add(blocking_handler);
$ev->add(blocked);
$ev->trigger($sample, new EventArgs);
echo "----------------\n";
function sole_handler($sender, $args)
{
echo "Sole handler";
}
$ev->remove_all();
$ev->add(sole_handler);
$ev->trigger($sample, new EventArgs);
?>