Tout d'abord, passons en revue l'utilisation de base de l'enregistrement et de l'annulation des fonctions des tiques:
<?php
declare(ticks=1);
function tickHandler() {
echo "Tick handler called.\n";
}
// registretickfonction
register_tick_function('tickHandler');
// L'exécution de code déclencheratickfonction调用
for ($i = 0; $i < 3; $i++) {
echo "Loop iteration $i\n";
}
// Déconnectertickfonction
unregister_tick_function('tickHandler');
?>
Dans l'exemple ci-dessus, le TickHandler sera appelé après l'exécution de chaque instruction. Le nom de la fonction transmis lors de l'appel ungister_tick_function doit être le même que le moment de l'enregistrement.
PHP lui-même ne fournit pas une API pour obtenir directement la liste des fonctions de tick actuellement enregistrées. Par conséquent, les développeurs doivent maintenir une liste des fonctions de tiques enregistrées elles-mêmes pour faciliter la déconnexion unifiée.
Exemple:
<?php
declare(ticks=1);
$registeredTickFunctions = [];
function registerTickFunctionWrapper($func) {
global $registeredTickFunctions;
register_tick_function($func);
$registeredTickFunctions[] = $func;
}
function unregisterAllTickFunctions() {
global $registeredTickFunctions;
foreach ($registeredTickFunctions as $func) {
unregister_tick_function($func);
}
$registeredTickFunctions = [];
}
// 示例fonction
function tickOne() {
echo "tickOne called\n";
}
function tickTwo() {
echo "tickTwo called\n";
}
// registretickfonction
registerTickFunctionWrapper('tickOne');
registerTickFunctionWrapper('tickTwo');
// L'exécution de code déclencheratickfonction调用
echo "Running ticks...\n";
// Déconnecter所有tickfonction
unregisterAllTickFunctions();
?>
En maintenant le tableau $ enregistredTickFunctions , vous pouvez vous assurer que toutes les fonctions peuvent être déconnectées.
Si vous utilisez des fonctions anonymes ou des fermetures pour enregistrer une fonction de tick, vous devez garder une référence à la même fermeture lors de la connexion, sinon vous ne pouvez pas vous déconnecter.
Exemple:
<?php
declare(ticks=1);
$closure = function() {
echo "Anonymous tick function called\n";
};
register_tick_function($closure);
// 尝试Déconnecter,Doit utiliser la même variable de fermeture
unregister_tick_function($closure);
?>
Ne passez pas directement dans de nouvelles fonctions anonymes, la déconnexion échouera.
Le Ungister_Tick_Function lui-même n'a pas de valeur de retour, et il est impossible de détecter directement si la déconnexion est réussie. Il peut être vérifié indirectement par:
Après avoir exécuté la déconnexion, exécutez le segment de code qui déclenche la coche pour observer si le rappel est toujours appelé.
En maintenant la variable d'état, détectez si la fonction doit être exécutée dans le rappel de tick.
<?php
declare(ticks=1);
$registeredTickFunctions = [];
function registerTickFunctionWrapper($func) {
global $registeredTickFunctions;
register_tick_function($func);
$registeredTickFunctions[] = $func;
}
function unregisterAllTickFunctions() {
global $registeredTickFunctions;
foreach ($registeredTickFunctions as $func) {
unregister_tick_function($func);
}
$registeredTickFunctions = [];
}
function tickHandlerA() {
echo "tickHandlerA triggered\n";
}
function tickHandlerB() {
echo "tickHandlerB triggered\n";
}
registerTickFunctionWrapper('tickHandlerA');
registerTickFunctionWrapper('tickHandlerB');
echo "Before unregister:\n";
for ($i = 0; $i < 2; $i++) {
echo "Iteration $i\n";
}
unregisterAllTickFunctions();
echo "After unregister:\n";
for ($i = 0; $i < 2; $i++) {
echo "Iteration $i\n";
}
?>
L'appel de la fonction de tick avant et après la déconnexion peut être clairement vu dans la sortie pour garantir la réussite de la déconnexion.
PHP n'a pas d'interface intégrée pour obtenir des fonctions de tiques enregistrées et doit être gérée par elle-même.
La maintenance unifiée de la liste des fonctions enregistrées est propice à l'annulation unifiée.
Les références doivent être conservées lors de l'utilisation de fonctions anonymes pour faciliter la déconnexion.
Vérifiez l'effet de déconnexion en déclenchant le test de code.
Ces conseils garantissent que Unregister_Tick_Function annule avec succès toutes les fonctions de tick.
Le contenu ci-dessus peut vous aider à mieux gérer les rappels de tiques et à éviter la fonction de tic résiduelle affectant le comportement du programme.
<?php
declare(ticks=1);
$registeredTickFunctions = [];
function registerTickFunctionWrapper($func) {
global $registeredTickFunctions;
register_tick_function($func);
$registeredTickFunctions[] = $func;
}
function unregisterAllTickFunctions() {
global $registeredTickFunctions;
foreach ($registeredTickFunctions as $func) {
unregister_tick_function($func);
}
$registeredTickFunctions = [];
}
function tickHandler() {
echo "Tick function called.\n";
}
// registretickfonction
registerTickFunctionWrapper('tickHandler');
echo "Before unregistering:\n";
for ($i = 0; $i < 3; $i++) {
echo "Loop iteration $i\n";
}
// Déconnecter所有tickfonction
unregisterAllTickFunctions();
echo "After unregistering:\n";
for ($i = 0; $i < 3; $i++) {
echo "Loop iteration $i\n";
}
?>