2012-05-21 3 views
2

У меня есть функция, которая запускает довольно общий код, который выполняет много рабочих соединений с базой данных и настраивает различные переменные конфигурации. Давайте не будем вникать в этику, пожалуйста, со мной. У меня есть несколько утверждений if этого кода верхнего уровня, который я запускаю, который фактически отличается от функции к функции.Создать функцию, которая принимает функцию

Вот как это выглядит сейчас.

function get_users(){ 
    // config 
    // set application keys 
    // connect to database 
    // retrieve user data 
    // authentication to foreign api 
    if(something){ 
    // some more red-tape 
    if(something){ 
     //more more 
     if(something){ 
     /* finally the good stuff */ 

     // the code here varies from function to function 
     // eg. get users 
     // probably will run: inner_get_users(); 

     } 
    } 
    } 
} 

function get_data(){ 
    // config 
    // set application keys 
    // connect to database 
    // retrieve user data 
    // authentication to foreign api 
    if(something){ 
    // some more red-tape 
    if(something){ 
     //more more 
     if(something){ 
     /* finally the good stuff */ 

     // the code here varies from function to function 
     // eg. get data 
     // probably will run: inner_get_data(); 

     } 
    } 
    } 
} 

Как я хочу работать, возможно, используя анонимные функции:

function instance($inner){ 
    // config 
    // set application keys 
    // connect to database 
    // retrieve user data 
    // authentication to foreign api 
    if(something){ 
    // some more red-tape 
    if(something){ 
     //more more 
     if(something){ 
     /* finally the good stuff */ 

     Call inner 

     } 
    } 
    } 
} 

function get_data(){ 

    instance(function(
    // get the data 
)); 

} 

или, может быть,

function get_users(){ 

    $var = function(
    // get the users 
); 

    instance($var); 

} 

Я ищу лучше, сушилкой и более в сопровождении кода.

+0

вы могли бы искать обратный вызов [call_user_func] (http://php.net/manual/en/function.call-user-func.php)? –

ответ

1

Это то, что PHP вызывает variable functions. Это работает, когда $inner является строковым именем функции, и когда это anonymous function (хотя справочная страница для переменных функций не объясняет это).

function instance($inner){ 
    // config 
    // set application keys 
    // connect to database 
    // retrieve user data 
    // authentication to foreign api 
    if(something){ 
    // some more red-tape 
    if(something){ 
     //more more 
     if(something){ 
     /* finally the good stuff */ 

     return $inner(); 

     } 
    } 
    } 
} 
+0

-1 Вы всегда хотите проверить, существует ли функция до ее вызова. – iambriansreed

+0

iambriansreed, нет, не всегда. Это зависит от того, как вы обрабатываете ошибки и ваш подход к защитному кодированию. Я предпочитаю агрессивное кодирование, когда вы позволяете вещам терпеть неудачу, если вы сделали что-то неправильно, так как гораздо проще устранить эту проблему. –

+0

«Лучше попросить прощения, чем разрешение», @ EmilVikström - это очень агрессивный стиль кодирования, возможно, блок try-catch, чтобы поймать любое исключение, вместо этого всегда использовать функцию set_error_handler, что дает нам большую гибкость при кодировании IMHO. –

Смежные вопросы