En effet, PHP n'offre aucun moyen de supprimer une telle fonction de rappel une fois qu'elle a été définie, puisque la fonction unregister_shutdown_function() n'existe pas.

Évidemment, certain esprits chagrins vont dire que cela n'est pas étonnant puisque PHP est un langage de merde notamment parce qu'il est incohérent, mais là n'est pas la question car cela n'apporte aucune solution au problème.

Et il y a effectivement une solution qui consiste à faire appel à une fermeture lexicale.

Une fermeture lexicale est une fonction anonyme dans laquelle est injectée, au moment de la sa définition, une ou plusieurs variables externes grâce au mot-clef use, de la manière suivante :

<?php

$fonctionAnonyme = function() {};
$fermetureLexicale = function() use ($foo) {};

?>

Dans le cas général, la valeur des variables injectées lorsque la fonction est exécutée est celle qu'elles avaient lors de la définition de la fermeture lexicale :

<?php

$foo = "c'est fou !";
$fermetureLexicale = function() use ($foo) { echo $foo . PHP_EOL; };
$foo = 'on va au bar ?';

$fermtureLexicale(); // Affiche « c'est fou ! »

?>

Il est cependant possible de modifier ce comportement grâce à l'opérateur &, de la manière suivante :

<?php

$foo = "c'est fou !";
$fermetureLexicale = function() use (& $foo) { echo $foo . PHP_EOL; };
$foo = 'on va au bar ?';

$fermtureLexicale(); // Affiche « on va au bar ? »

?>

Grâce à ce mécanisme, Il est donc possible de piloter le comportement d'une fonction de rappel passé à register_shutdown_function().

Il suffit en effet de modifier son comportement en fonction de la valeur d'une variable injecté via le combo use et &, de la manière suivante :

<?php

$phpEstDeLaMerde = true;

register_shutdown_function(function() use (& $phpEstDeLaMerde) {
   if ($phpEstDeLaMerde)
      echo 'PHP est de la merde !' . PHP_EOL;
   }
);

$phpEstDeLaMerde = false;

// « PHP est de la merde ! » ne s'affichera pas

?>

Avec un peu d'astuce, il est donc bien possible de faire en sorte qu'une fonction passée à register_shutdown_function() n'est aucun effet, ou bien présente un comportement différent en fonction des valeurs de une ou plusieurs variables susceptibles d'être modifiées au cours de l'exécution du script.