2010-07-01 11 views
5

fui sfidato come rompere o l'esecuzione fine di una funzione genitore senza modificare il codice del genitore, utilizzando PHPRottura funzione principale all'interno di una funzione figlio (PHP Preferibilmente)

non riesco a capire qualsiasi soluzione, diverso da morire(); nel bambino, che finirebbe tutta l'esecuzione, e quindi qualsiasi cosa dopo la chiamata della funzione genitore sarebbe terminata. Qualche idea? esempio

codice:

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 - le funzioni di spunta sono oscure, probabilmente hanno prestazioni da incubo e in qualche modo scarsamente documentate. Ma ti permettono di eseguire in modo efficace una funzione di tua scelta ogni n affermazioni. Significa che la tua funzione di spunta potrebbe essere eseguita nel mezzo di qualsiasi altra funzione di esecuzione. –

+0

@ Frank Sarei interessato a come potrebbe essere trasformata in una soluzione per questo "problema". Con tutti i mezzi, qualcuno posta una risposta, per favore! :) – deceze

+0

Per la cronaca, [runkit_function_redefine()] (http://us3.php.net/manual/en/function.runkit-function-redefine.php) non mi piace quando ridefinisci una funzione attualmente in esecuzione . :) –

risposta

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 grazie, ho pensato che per qualche motivo l'eccezione sarebbe tornata a victim() ;. c'è un modo per fare una cosa del genere senza il blocco try? –

+0

@Fran No (beh, forse internamente è possibile, ma sarebbe molto hacky). Si può gestire l'eccezione all'interno della vittima, avvolgere la vittima in un'altra funzione che gestisca l'eccezione o semplicemente restituire un valore booleano in killer che dice se l'esecuzione dovrebbe continuare e avere vittima rispetto. – Artefacto

+0

Questo è quello che ho capito, ero più curioso di tutto. grazie ragazzi! –

0

Nota che le eccezioni non stanno andando a lavorare nel seguente scenario:

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(); 

Si avrebbe bisogno di qualche altra cosa, l'unica cosa più robusta sarebbe qualcosa come installare il proprio gestore di errori, assicurarsi che tutti gli errori siano segnalati al gestore degli errori e assicurarsi che gli errori non vengano convertiti in eccezioni; quindi innescare un errore e fare in modo che il gestore degli errori interrompa lo script una volta terminato. In questo modo è possibile eseguire codice al di fuori del contesto di killer()/victim() e impedire a victim() di completare normalmente (solo se si uccide lo script come parte del gestore degli errori).