2010-10-25 7 views
2

Некоторые функции в PHP требуют функции обратного вызова. Как я могу сделать это в функции самостоятельно? Прежде всего, как определить функцию, которая требует функции обратного вызова?PHP: функции обратного вызова

И, во-вторых, как я могу предоставить пользовательскую функцию в качестве функции обратного вызова? Как предоставить регулярную функцию, функцию экземпляра и статическую функцию?

+0

прочитать инструкцию - http://php.net/manual/en/language.pseudo-types.php .Это является первым результатом для поиска Google на «функции обратного вызова PHP» – thetaiko

+0

возможного дубликата [Как реализовать обратный вызов в PHP?] (Http://stackoverflow.com/questions/48947/how-do-implement-a-callback-in-php) – Gordon

+0

Имейте в виду, что PHP 5.3 представил закрытие, и, следовательно, использование обратного вызова может быть различным между пре-5.3 и 5.3+. – erjiang

ответ

1

Использование встроенного в call_user_func(). Это может быть необходимо использовать call_user_func_array()

function work($a, $c) { 
    $a = filter($a) 
    if(!is_callable($c) || !call_user_func($c, $a)) { 
    return 0; // throw error 
    } else { 
    return 1; // return success 
    } 
} 

Это безопаснее, чем просто делать $c($a) a.k.a passed_callback (passed_argument), так как проверка, чтобы увидеть, если на самом деле существует функция делается для вас, хотя некоторые из них прокомментировал снижение производительности над $c($a).

+1

Возможно, лучше использовать is_callable(), чтобы гарантировать, что $ c является вызываемой функцией. – mellowsoon

+0

@mellowsoon: Хорошая точка. Ответ обновлен. –

+0

Я бы, вероятно, использовал нечто похожее на ваш код, чтобы быть полным, но я не уверен, что это имеет значение. Передача не вызываемой функции приведет к одной из двух вещей: ваш код будет вызывать ошибку, потому что вы использовали is_callable, или PHP собирается выдать ошибку, потому что $ c() не является действительным обратным вызовом. Конечный результат тот же, но последний быстрее, потому что он избегает вызова is_callable и call_user_func. – mellowsoon

1
function myFunc($param1, $param2, $callback) { 
    $data = get_data($param1, $param2) 
    $callback($data); 
} 
1

Вы можете использовать тип hinting, чтобы заставить кого-то использовать определенный тип переменной.

function test(callable $test){ 
    echo __LINE__.PHP_EOL; 
    $test(); 
    echo __LINE__.PHP_EOL; 
} 

test(function(){ 
    echo __LINE__.PHP_EOL; 
}); 
Смежные вопросы