2010-10-25 112 views
2

PHP中的某些函數需要回調函數。我如何在一個函數中自己做到這一點?首先,我如何定義一個需要回調函數的函數?PHP:回調函數

其次,如何提供自定義函數作爲回調函數?我如何提供常規函數,實例函數和靜態函數?

+0

閱讀手冊 - http://php.net/manual/en/language.pseudo-types.php 。這是對「PHP回調函數」的 – thetaiko 2010-10-25 15:45:12

+0

可能重複的谷歌搜索的第一個結果[如何在PHP中實現回調?](http://stackoverflow.com/questions/48947/how-do-i-implement-a-callback-in-php) – Gordon 2010-10-25 15:52:18

+0

請記住,PHP 5.3引入了閉包,因此5.3之前和5.3+之間的回調使用可能不同。 – erjiang 2010-10-25 16:58:11

回答

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 2010-10-25 16:21:46

+0

@mellowsoon:好點。答案已更新。 – 2010-10-25 16:42:25

+0

我可能會使用類似於您的代碼的東西來完成,但我不確定它是否有所作爲。傳遞一個不可調用的函數會導致以下兩種情況之一:你的代碼會因爲使用is_callable而引發錯誤,或者PHP會拋出錯誤,因爲$ c()不是有效的回調函數。最終結果是相同的,但後者更快,因爲它避免了調用is_callable和call_user_func。 – mellowsoon 2010-10-25 16:59:58

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

您可以使用類型提示來強制某人使用特定類型的變量。

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

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