정의 및 사용법
콜백(Callback)은 PHP에서 제공하는 의사 타입(pseudo-type)입니다. PHP 5.4부터는 콜백과 유사한 Callable 타입 힌트가 도입되었습니다. 어떤 값이 '호출 가능(callable)'하다고 식별된다는 것은, 그 값이 함수처럼 호출될 수 있음을 의미합니다. 호출 가능한 대상은 PHP 내장 함수일 수도 있고, 사용자가 직접 정의한 함수나 클래스 내부의 메서드일 수도 있습니다.
is_callable() 함수를 사용하면 특정 식별자가 호출 가능한지 여부를 검증할 수 있습니다. 또한 PHP는 함수 이름을 인수로 받아 실행하는 call_user_func() 함수를 기본적으로 제공합니다.
다음 예제는 PHP 내장 함수 역시 호출 가능한 대상임을 보여줍니다.
예제
<?php
var_dump (is_callable("abs"));
?>
출력 결과
bool(true)
다음 예제에서는 사용자가 직접 정의한 함수가 호출 가능한지 확인한 뒤, 실제로 호출까지 수행합니다.
예제
<?php
function myfunction(){
echo "Hello World";
}
echo is_callable("myfunction") . "\n";
call_user_func("myfunction")
?>
출력 결과
1 Hello World
객체의 메서드를 콜백으로 전달하려면, 객체 자신과 메서드 이름을 배열의 두 요소로 묶어서 전달하면 됩니다.
예제
<?php
class myclass{
function mymethod(){
echo "This is a callable" . "\n";
}
}
$obj=new myclass();
call_user_func(array($obj, "mymethod"));
//배열 리터럴 형태로 전달
call_user_func([$obj, "mymethod"]);
?>
출력 결과
This is a callable This is a callable
클래스의 정적(static) 메서드 역시 콜백으로 전달할 수 있습니다. 이 경우에는 객체 대신 클래스 이름이 배열의 첫 번째 요소로 들어갑니다.
예제
<?php
class myclass{
static function mymethod(){
echo "This is a callable" . "\n";
}
}
$obj=new myclass();
call_user_func(array("myclass", "mymethod"));
//범위 해결 연산자(::) 사용
call_user_func("myclass::mymethod");
?>
출력 결과
This is a callable This is a callable
참고: PHP 8.1의 퍼스트 클래스 콜러블 문법
PHP 8.1부터는 strlen(...)처럼 함수 이름 뒤에 ...를 붙여 Closure 객체를 만드는 '퍼스트 클래스 콜러블(first-class callable)' 문법이 도입되었습니다. 이 방식을 사용하면 문자열이나 배열 형태의 콜백보다 정적 분석 도구와 IDE의 지원을 더 잘 받을 수 있어, 최신 PHP 프로젝트에서 권장되는 방식입니다.