2010-07-01 17 views
5

m'a mis au défi la façon de rompre ou de l'exécution de la fin d'une fonction de parent sans modifier le code de la mère, en utilisant PHPla rupture d'une fonction de parent à partir d'une fonction d'enfant (PHP De préférence)

je ne peux pas comprendre toute solution, autre que mourir(); dans l'enfant, ce qui mettrait fin à toute l'exécution, et donc quelque chose après la fin de l'appel de la fonction parent. Des idées?

exemple de code:

function victim() { 
    echo "I should be run"; 
    killer(); 
    echo "I should not"; 
} 
function killer() { 
    //code to break parent here 
} 
victim(); 
echo "This should still run"; 
+0

http://php.net/register_tick_function - les fonctions de ticks sont obscures, probablement des cauchemars de performance, et quelque peu mal documentées. Mais ils vous permettent d'exécuter efficacement une fonction de votre choix toutes les n déclarations. Ce qui signifie que votre fonction de tic pourrait s'exécuter au milieu de l'exécution d'une autre fonction. –

+0

@Frank Je serais intéressé comment cela pourrait être transformé en une solution pour ce "problème". Par tous les moyens, quelqu'un poster une réponse, s'il vous plaît! :) – deceze

+0

Pour l'anecdote, [runkit_function_redefine()] (http://us3.php.net/manual/fr/function.runkit-function-redefine.php) ne l'aime pas lorsque vous redéfinissez une fonction en cours d'exécution . :) –

Répondre

7
function victim() { 
    echo "I should be run"; 
    killer(); 
    echo "I should not"; 
} 
function killer() { 
    throw new Exception('Die!'); 
} 

try { 
    victim(); 
} catch (Exception $e) { 
    // note that catch blocks shouldn't be empty :) 
} 
echo "This should still run"; 
+0

ok merci, je pensais que pour une raison quelconque, l'exception reviendrait à la victime() ;. est-il possible de faire une telle chose sans le bloc try? –

+0

@Fran Non (eh bien, peut-être que c'est possible en interne, mais ce serait très hacky). Vous pouvez gérer l'exception à l'intérieur de la victime, envelopper la victime dans une autre fonction qui gèrerait l'exception ou simplement renvoyer une valeur booléenne dans le tueur qui indique si l'exécution doit continuer et que la victime respecte cela. – Artefacto

+0

C'est ce que j'ai pensé, j'étais plus curieux que n'importe quoi. Merci les gars! –

0

Notez que les exceptions ne vont pas travailler dans le scénario suivant:

function victim() { 
    echo "this runs"; 
    try { 
    killer(); 
    } 
    catch(Exception $sudden_death) { 
    echo "still alive"; 
    } 
    echo "and this runs just fine, too"; 
} 

function killer() { throw new Exception("This is not going to work!"); } 

victim(); 

Vous auriez besoin d'autre chose, la seule chose plus robuste serait quelque chose comme l'installation de votre propre gestionnaire d'erreurs, assurez-vous que toutes les erreurs sont signalées au gestionnaire d'erreurs et assurez-vous que les erreurs ne sont pas converties en exceptions; puis déclenchez une erreur et demandez à votre gestionnaire d'erreur de tuer le script une fois terminé. De cette façon, vous pouvez exécuter du code en dehors du contexte de killer()/victim() et empêcher que victim() ne se termine normalement (seulement si vous supprimez le script dans le cadre de votre gestionnaire d'erreurs).