C#ライクなデリゲートの実装
<?php
class Delegate
{
/** @var callable[] */
protected $callbacks = [];
/**
* Add callback function
* @param callable $callback
* @return $this
*/
public function add(callable $callback)
{
$this->callbacks[] = $callback;
return $this;
}
/**
* Remove callback function
* @param callable $callback
* @return $this
*/
public function remove(callable $callback)
{
foreach ( $this->callbacks as $key => $_callback )
{
if ( $callback == $_callback )
{
unset($this->callbacks[$key]);
return $this;
}
}
return $this;
}
/**
* Invoke callback functions
* @return mixed
*/
public function __invoke()
{
$result = null;
foreach ( $this->callbacks as $callback )
{
$result = call_user_func_array($callback, func_get_args());
}
return $result;
}
}
$callback = function($name) {
echo "Hello $name", PHP_EOL;
};
$delegate = new Delegate();
$delegate
->add($callback)
->add($callback)
->remove($callback);
$delegate("World");