PHP基礎(chǔ)之?dāng)?shù)據(jù)類型9——回調(diào)類型(callback)
自 PHP 5.4 起可用 callable 類型指定回調(diào)類型 callback。本文檔基于同樣理由使用 callback 類型信息。
一些函數(shù)如 call_user_func() 或 usort() 可以接受用戶自定義的回調(diào)函數(shù)作為參數(shù)。回調(diào)函數(shù)不止可以是簡(jiǎn)單函數(shù),還可以是對(duì)象的方法,包括靜態(tài)類方法。
傳遞一個(gè) PHP 的函數(shù)以 string 類型傳遞其名稱。可以使用任何內(nèi)置或用戶自定義函數(shù),但除了語(yǔ)言結(jié)構(gòu)例如: array(), echo, empty(), eval(), exit(), isset(), list(), print 或 unset()。
一個(gè)已實(shí)例化的對(duì)象的方法被作為數(shù)組傳遞,下標(biāo) 0 包含該對(duì)象,下標(biāo) 1 包含方法名。
靜態(tài)類方法也可不經(jīng)實(shí)例化該類的對(duì)象而傳遞,只要在下標(biāo) 0 中包含類名而不是對(duì)象。自 PHP 5.2.3 起,也可以傳遞 ’ClassName::methodName’。
除了普通的用戶自定義函數(shù)外, create_function() 可以用來(lái)創(chuàng)建一個(gè)匿名回調(diào)函數(shù)。自 PHP 5.3.0 起也可傳遞 closure 給回調(diào)參數(shù)。
Example #1 回調(diào)函數(shù)示例
<?php
// An example callback function
function my_callback_function() {
???echo ’hello world!’;
}
// An example callback method
class MyClass {
???static function myCallbackMethod() {
???????echo ’Hello World!’;
???}
}
// Type 1: Simple callback
call_user_func(’my_callback_function’);
// Type 2: Static class method call
call_user_func(array(’MyClass’, ’myCallbackMethod’));
// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, ’myCallbackMethod’));
// Type 4: Static class method call (As of PHP 5.2.3)
call_user_func(’MyClass::myCallbackMethod’);
// Type 5: Relative static class method call (As of PHP 5.3.0)
class A {
???public static function who() {
???????echo 'An';
???}
}
class B extends A {
???public static function who() {
???????echo 'Bn';
???}
}
call_user_func(array(’B’, ’parent::who’)); // A
?>
Example #2 使用 Closure 的示例
<?php
// Our closure
$double = function($a) {
???return $a * 2;
};
// This is our range of numbers
$numbers = range(1, 5);
// Use the closure as a callback here to
// double the size of each element in our
// range
$new_numbers = array_map($double, $numbers);
print implode(’ ’, $new_numbers);
?>
以上例程會(huì)輸出:
2 4 6 8 10
Note: 在 PHP 4 中,需要使用一個(gè)引用來(lái)創(chuàng)建一個(gè)指向具體對(duì)象的回調(diào)函數(shù),而不是一個(gè)拷貝。參見(jiàn)引用的解釋。
Note:
在函數(shù)中注冊(cè)有多個(gè)回調(diào)內(nèi)容時(shí)(如使用 call_user_func() 與 call_user_func_array()),如在前一個(gè)回調(diào)中有未捕獲的異常,其后的將不再被調(diào)用。
相關(guān)文章:
1. Python如何批量生成和調(diào)用變量2. ASP.NET MVC實(shí)現(xiàn)橫向展示購(gòu)物車3. ASP.Net Core對(duì)USB攝像頭進(jìn)行截圖4. .net如何優(yōu)雅的使用EFCore實(shí)例詳解5. ASP.Net Core(C#)創(chuàng)建Web站點(diǎn)的實(shí)現(xiàn)6. python 爬取京東指定商品評(píng)論并進(jìn)行情感分析7. python基礎(chǔ)之匿名函數(shù)詳解8. Python獲取B站粉絲數(shù)的示例代碼9. ajax動(dòng)態(tài)加載json數(shù)據(jù)并詳細(xì)解析10. 通過(guò)CSS數(shù)學(xué)函數(shù)實(shí)現(xiàn)動(dòng)畫(huà)特效
