O register_shutdown_function() ile kurulmuş bir işlevi (veya tüm fonksiyonlarını) kaydını PHP mümkün mü?
Yapabileceğini inanmıyorum. Bir geri çağırma işlevini kaydını tek yolu sadece gerçekte belirli koşullara göre onu çağırır sınıf çeşit sarın etmektir. Bu kullanışlı fonksiyon sarıcı gibi:
class UnregisterableCallback{
// Store the Callback for Later
private $callback;
// Check if the argument is callable, if so store it
public function __construct($callback)
{
if(is_callable($callback))
{
$this->callback = $callback;
}
else
{
throw new InvalidArgumentException("Not a Callback");
}
}
// Check if the argument has been unregistered, if not call it
public function call()
{
if($this->callback == false)
return false;
$callback = $this->callback;
$callback(); // weird PHP bug
}
// Unregister the callback
public function unregister()
{
$this->callback = false;
}
}
Temel kullanım:
$callback = new UnregisterableCallback(array($object, "myFunc"));
register_shutdown_function(array($callback, "call"));
Kaydını
$callback->unregister();
Çağrıldığında Şimdi, bu return false ve geri arama işlevini çağırın olmaz. Orada bu süreci hızlandırmak için bir kaç yolu olabilir, ama çalışıyor olabilir.
Bunu düzene böyle bir yolu geri çağırma işlevi bir yöntem haline geri arama gerçek kaydını koymak olacaktır, böylece dış dünya size register_shutdown_function için geçmek zorunda yöntemi "diyoruz" olduğu bilgisine sahip olmak zorunda değildir.
Chacha102 ait, ama kapatma işlevinde bir statik değişkeni kullanarak benzer başka bir çözüm.
function shutdown() {
//no way to unregister a shutdown function, but calling shutdown('disable') will disable it
static $disabled = false;
$args = func_get_args();
if ($args && $args[0] == 'disable')
$disabled = true;
if ($disabled)
return;
//perform shutdown routine
}