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 ���ݣ��±� 0 ������ object���±� 1 ������������ ��ͬһ��������Է��� protected �� private ������

��̬�෽��Ҳ�ɲ���ʵ��������Ķ�������ݣ�ֻҪ���±� 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 A {
    public static function 
who() {
        echo 
"A\n";
    }
}

class 
B extends A {
    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 C {
    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(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);
?>

�������̻������

2 4 6 8 10

Note:

�ں�����ע���ж���ص�����ʱ(��ʹ�� call_user_func() �� call_user_func_array())������ǰһ���ص�����δ������쳣�����Ľ����ٱ����á�