You can have an array of definitions:
$callbacks = array ( array ( 'function' => 'function_1', 'rollback' => 'function_r1', 'arguments' => array(1), ), array ( 'function' => 'function_2', 'rollback' => 'function_r2', 'arguments' => array(1, 2), ), array ( 'function' => 'function_3', 'rollback' => 'function_r3', 'arguments' => array(1, 2, 3), ), );
And do something like this:
$callbacks = array_values($callbacks); foreach ($callbacks as $key => $callback) { if (call_user_func_array($callback['function'], $callback['arguments']) !== true) { // failed, calling necessary rollbacks in reverse order foreach (array_reverse(array_slice($callbacks, 0, $key)) as $rollback) { if (is_callable($rollback['rollback']) === true) { call_user_func_array($rollback['rollback'], $rollback['arguments']); } } break; } // success }
source share