Position actuelle: Accueil> Derniers articles> Comment s'assurer que Unregister_tick_Function connecte avec succès toutes les fonctions de tiques

Comment s'assurer que Unregister_tick_Function connecte avec succès toutes les fonctions de tiques

gitbox 2025-05-31

1. Bases de l'enregistrement des fonctions de tiques et annulation

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&#39;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.


2. Comment s'assurer que toutes les fonctions de tiques sont déconnectées avec succès?

2.1 Enregistrement des fonctions de tiques enregistrées

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&#39;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.


2.2 Faites attention lorsque vous utilisez des fonctions ou des fermetures anonymes

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.


2.3 Conseils pour confirmer la déconnexion réussie

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.


2.4 Exemple: Processus complet d'enregistrement, d'exécution et d'annulation

 <?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.


3. Résumé

  • 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";
}
?>