소개
PHP에서는 변수 이름 뒤에 괄호를 붙이면(괄호 안에 매개변수가 있든 없든) PHP 파서가 해당 변수의 값과 일치하는 이름을 가진 함수를 찾아 실행합니다. 이렇게 동작하는 함수를 변수 함수(variable function)라고 부릅니다. 이 기능은 콜백(callback) 구현이나 함수 테이블(function table) 작성 등에 매우 유용하게 활용됩니다.
다만 include, require, echo와 같은 언어 구조(language constructs)에는 변수 함수 문법을 직접 사용할 수 없습니다. 이 경우에는 함수 래퍼(wrapper)를 만들어 우회하는 방법을 사용해야 합니다.
변수 함수 기본 예제
다음 예제에서는 변수의 값이 함수 이름과 일치합니다. 변수 뒤에 괄호를 붙이면 해당 함수가 호출됩니다.
예제
<?php
function hello(){
echo "Hello World";
}
$var="Hello";
$var();
?>
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Hello World
다음은 인수(argument)를 함께 전달하는 변수 함수의 또 다른 예제입니다.
예제
<?php
function add($x, $y){
echo $x+$y;
}
$var="add";
$var(10,20);
?>
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
30
다음 예제에서는 호출할 함수의 이름을 사용자로부터 입력받아 실행합니다.
예제
<?php
function add($x, $y){
echo $x+$y;
}
function sub($x, $y){
echo $x-$y;
}
$var=readline("enter name of function: ");
$var(10,20);
?>
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
enter name of function: add
30
변수 메서드 예제
변수 함수의 개념은 클래스의 메서드(method)에도 그대로 확장하여 적용할 수 있습니다.
예제
<?php
class myclass{
function welcome($name){
echo "Welcome $name";
}
}
$obj=new myclass();
$f="welcome";
$obj->$f("Amar");
?>
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Welcome Amar
정적(static) 메서드 역시 변수 메서드 기법으로 호출할 수 있습니다.
예제
<?php
class myclass{
static function welcome($name){
echo "Welcome $name";
}
}
$f="welcome";
myclass::$f("Amar");
?>
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Welcome Amar
마무리 및 주의 사항
변수 함수는 코드의 유연성을 크게 높여 주는 강력한 기능입니다. 하지만 사용자 입력값을 그대로 함수 이름으로 사용하는 것은 보안상 위험할 수 있습니다. 악의적인 입력으로 시스템 내부의 민감한 함수가 호출되지 않도록, 반드시 허용된 함수 이름 목록(화이트리스트)을 검증한 후에 호출하는 것이 안전합니다.