2010-07-01 25 views
5

fui desafiado cómo romper o ejecución final de una función madre sin modificar el código de la matriz, usando PHPRompiendo una función madre dentro de una función niño (PHP Preferiblemente)

No puedo imaginar ninguna solución, distinto de die(); en el niño, lo que pondría fin a toda ejecución, por lo que cualquier cosa después de la llamada a la función principal terminaría. ¿Algunas ideas? ejemplo

código:

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 - las funciones tic son oscuras, probablemente pesadillas de rendimiento, y algo mal documentadas. Pero te permiten ejecutar efectivamente una función de tu elección cada n declaraciones. Lo que significa que su función tic se podría ejecutar en el medio de la ejecución de cualquier otra función. –

+0

@Frank Me interesaría saber cómo se podría convertir eso en una solución para este "problema". Por supuesto, alguien publique una respuesta, por favor! :) – deceze

+0

Para el registro, [runkit_function_redefine()] (http://us3.php.net/manual/en/function.runkit-function-redefine.php) no le gusta cuando redefine una función actualmente en ejecución . :) –

Respuesta

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 gracias, pensé que por alguna razón la excepción volvería a la víctima() ;. ¿Hay alguna manera de hacer tal cosa sin el bloque try? –

+0

@Fran No (bueno, quizás internamente es posible, pero sería muy raro). Podrías manejar la excepción dentro de la víctima, envolver a la víctima en otra función que manejaría la excepción o simplemente devolver un valor booleano en el asesino que diga si la ejecución debe continuar y que la víctima respete eso. – Artefacto

+0

Eso es lo que pensé, era más curioso que cualquier cosa. ¡gracias chicos! –

0

Nota que las excepciones no van a trabajar en el siguiente escenario:

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

Se necesitaría otra cosa, la única cosa más robusto sería algo así como instalar tu propio manejador de errores, asegurarte de que todos los errores sean reportados al manejador de errores y asegurar que los errores no se conviertan en excepciones; luego desencadenar un error y hacer que el manejador de errores lo mate cuando esté listo. De esta forma puede ejecutar código fuera del contexto de killer()/victim() y evitar que victim() se complete normalmente (solo si mata el script como parte de su manejador de errores).

Cuestiones relacionadas