콜백 / 콜러블(Callbacks / Callables)
콜백은 callable 유형 선언으로 표시할 수 있습니다.
call_user_func() 또는 usort()와 같은 일부 함수는 사용자 정의 콜백 함수를 매개변수로 받아들입니다. 콜백 함수는 단순한 함수일 뿐만 아니라 정적 클래스 메서드를 포함한 객체 메서드일 수도 있습니다.
Passing
PHP 함수는 이름으로 문자열로 전달됩니다. array(), echo, empty(), eval(), exit(), isset(), list(), print 또는 unset()과 같은 언어 구조를 제외한 모든 내장 또는 사용자 정의 함수를 사용할 수 있습니다.
인스턴스화된 개체의 메서드는 인덱스 0의 개체와 인덱스 1의 메서드 이름을 포함하는 배열로 전달됩니다. 클래스 내에서 보호된 메서드와 비공개 메서드에 액세스하는 것이 허용됩니다.
정적 클래스 메서드는 인덱스 0에 있는 개체 대신 클래스 이름을 전달하거나 'ClassName::methodName'을 전달하여 해당 클래스의 개체를 인스턴스화하지 않고 전달할 수도 있습니다.
일반적인 사용자 정의 함수 외에도 익명 함수와 화살표 함수도 콜백 매개변수에 전달할 수 있습니다.
일반적으로 __invoke()를 구현하는 모든 객체는 콜백 매개변수에 전달할 수도 있습니다.
예제 #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
call_user_func('MyClass::myCallbackMethod');
// Type 5: Relative static class method call
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
class C {
public function __invoke($name) {
echo 'Hello ', $name, "\n";
}
}
$c = new C();
call_user_func($c, 'PHP!');
?>
예제 #2 클로저를 사용한 콜백 예제
<?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
메모: call_user_func() 및 call_user_func_array()와 같은 함수로 등록된 콜백은 이전 콜백에서 throw된 잡히지 않은 예외가 있는 경우 호출되지 않습니다.