Callback / Callable 锟斤拷锟斤拷

锟斤拷 PHP 5.4 锟斤拷锟斤拷锟� callable 锟斤拷锟斤拷指锟斤拷锟截碉拷锟斤拷锟斤拷 callback锟斤拷锟斤拷锟侥碉拷锟斤拷锟斤拷同锟斤拷锟斤拷锟斤拷使锟斤拷 callback 锟斤拷锟斤拷锟斤拷息锟斤拷

一些锟斤拷锟斤拷锟斤拷 call_user_func() 锟斤拷 usort() 锟斤拷锟皆斤拷锟斤拷锟矫伙拷锟皆讹拷锟斤拷幕氐锟斤拷锟斤拷锟斤拷锟轿拷锟斤拷锟斤拷锟斤拷氐锟斤拷锟斤拷锟斤拷锟街癸拷锟斤拷锟斤拷羌虻ズ锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷嵌锟斤拷锟侥凤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷态锟洁方锟斤拷锟斤拷

锟斤拷锟斤拷

PHP锟角斤拷锟斤拷锟斤拷锟斤拷string锟斤拷式锟斤拷锟捷的★拷 锟斤拷锟斤拷使锟斤拷锟轿猴拷锟斤拷锟矫伙拷锟矫伙拷锟皆讹拷锟藉函锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟皆结构锟斤拷锟界:array()锟斤拷echo锟斤拷empty()锟斤拷eval()锟斤拷exit()锟斤拷isset()锟斤拷list()锟斤拷print 锟斤拷 unset()锟斤拷

一锟斤拷锟斤拷实锟斤拷锟斤拷锟斤拷 object 锟侥凤拷锟斤拷锟斤拷锟斤拷为 array 锟斤拷锟捷o拷锟铰憋拷 0 锟斤拷锟斤拷锟斤拷 object锟斤拷锟铰憋拷 1 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 锟斤拷同一锟斤拷锟斤拷锟斤拷锟斤拷苑锟斤拷锟� protected 锟斤拷 private 锟斤拷锟斤拷锟斤拷

锟斤拷态锟洁方锟斤拷也锟缴诧拷锟斤拷实锟斤拷锟斤拷锟斤拷锟斤拷亩锟斤拷锟斤拷锟斤拷锟捷o拷只要锟斤拷锟铰憋拷 0 锟叫帮拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟角讹拷锟斤拷锟斤拷 PHP 5.2.3 锟斤拷也锟斤拷锟皆达拷锟斤拷 'ClassName::methodName'锟斤拷

锟斤拷锟斤拷锟斤拷通锟斤拷锟矫伙拷锟皆讹拷锟藉函锟斤拷锟解,也锟缴达拷锟斤拷 锟斤拷锟斤拷锟斤拷锟斤拷 锟斤拷锟截碉拷锟斤拷锟斤拷锟斤拷

Example #1 锟截碉拷锟斤拷锟斤拷示锟斤拷

<?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 {
    public static function 
who() {
        echo 
"A\n";
    }
}

class 
extends {
    public static function 
who() {
        echo 
"B\n";
    }
}

call_user_func(array('B''parent::who')); // A

// Type 6: Objects implementing __invoke can be used as callables (since PHP 5.3)
class {
    public function 
__invoke($name) {
        echo 
'Hello '$name"\n";
    }
}

$c = new C();
call_user_func($c'PHP!');
?>

Example #2 使锟斤拷 Closure 锟斤拷示锟斤拷

<?php
// Our closure
$double = function($a) {
    return 
$a 2;
};

// This is our range of numbers
$numbers range(15);

// 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);
?>

锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�

2 4 6 8 10

Note:

锟节猴拷锟斤拷锟斤拷注锟斤拷锟叫讹拷锟斤拷氐锟斤拷锟斤拷锟绞�(锟斤拷使锟斤拷 call_user_func() 锟斤拷 call_user_func_array())锟斤拷锟斤拷锟斤拷前一锟斤拷锟截碉拷锟斤拷锟斤拷未锟斤拷锟斤拷锟斤拷斐o拷锟斤拷锟斤拷慕锟斤拷锟斤拷俦锟斤拷锟斤拷谩锟�