:
$first = register_cancellable_shutdown_function(function() {
echo "This function is never called\n";
});
$second = register_cancellable_shutdown_function(function() {
echo "This function is going to be called\n";
});
cancel_shutdown_function($first);
出力:
$ php test.php
This function is going to be called
The code:
使用例
function register_named_shutdown_function($name, $callback)
{
static $callbacks = [];
$callbacks[$name] = $callback;
static $registered;
$registered || $registered = register_shutdown_function(function() use (&$callbacks) {
array_map(function ($callback) {
call_user_func($callback);
}, $callbacks);
}) || true;
}
:
register_named_shutdown_function("first", function() {
echo "Never executed\n";
});
register_named_shutdown_function("second", function() {
echo "Secondly executed\n";
});
register_named_shutdown_function("first", function() {
echo "Firstly executed\n";
});
出力:10
function register_cancellable_shutdown_function($callback)
{
return new cancellable_shutdown_function_envelope($callback);
}
function cancel_shutdown_function($envelope)
{
$envelope->cancel();
}
final class cancellable_shutdown_function_envelope
{
private $callback;
public function __construct($callback)
{
$this->callback = $callback;
register_shutdown_function(function() {
$this->callback && call_user_func($this->callback);
});
}
public function cancel()
{
$this->callback = false;
}
}
リンクがダウンしている.... – Pacerier
とスコットなど指摘されている、それは可能です – vivoconunxino