유동변수란 변수명을 정해두지 않고 변경이 가능한 변수를 뜻합니다. 변수 뿐만 아니라 함수도 마찬가지로 응용할 수 있습니다.
일반적인 변수 사용예
$var = "test";
echo $var;
유동변수의 예
$var1 = "test variable 1";
$var2 = "test variable 2";
for ($i = 1; $i <= 2; $i++) {
echo ${'var'. $i} .'<br>';
}
test variable 2
{ } 안의 내용을 보면 'var' 라는 문자열과 변수 $i 를 '문자열 결합' 하는 것이란 걸 알수 있습니다. 즉, 문자열 결합을 통해 'var1' 이라는 문자가 만들어 집니다.
유동변수의 다른 표현 방법
$var_name = 'var';
$var = 'test';
echo $$var_name;
$를 두번 사용해서 $$var_name 하는 경우 ${$var_name} 과 같은 결과를 볼 수 있습니다.
값을 입력하는 경우도 마찬가지 입니다.
$var_name = 'var';
${$var_name} = 'test variable 1';
echo $var;
그렇다면 변수만 가능한 것일까?
그렇지 않습니다. 함수에도 얼마든지 사용할 수 있습니다. 함수에 사용할 때에는 헷갈릴 수도 있으나 변수와 함수의 규칙을 이해하면 그리 어렵지 않습니다.
변수는 기본적으로 $[a-zA-Z_][a-zA-Z0-9_]* 의 형식으로 작성하도록 되어 있습니다. ($로 시작하고, 첫글자는 반드시 영문이거나 _로 시작하며, 숫자와 영문과 _ 의 조합, 정확히는 $[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)
즉, 기본적으로 $가 하나 붙게 되니 함수에 사용할 때와는 달리 $가 하나 적게 됩니다.
(그러나 변수 안에 유동변수로 또 한겹을 더 쓰는 경우 $$가 두개가 됩니다.)
유동함수 사용 예
function test_func($v = '') {
echo "it's test function.". $v;
}
$var_name = 'test_func';
echo $var_name .'<br>';
echo $var_name() .'<br>';
echo $var_name('value!');
it's test function.
it's test function.value!
첫번째 echo 에서는 일반변수 형식으로 $var_name 을 출력했습니다.
두번째, 세번째는 변수명 뒤에 () 를 붙여줌으로서 유동함수라는 것을 표시하고 있는 것이죠.
변수에 담긴 함수명의 2중 호출
function test() {
echo "it's test function.";
}
$func_name = 'test';
$func = 'func_name';
$$func();
그렇다면 함수명에 숫자가 들어가서 반복되는 경우는 어떻게 만들까요?
답은 간단합니다.
function test_1($v = '') {
echo "it's test function. ". $v;
}
function test_2($v = '') {
echo "second function. ". $v;
}
$var_name = 'test_';
for ($i = 1; $i <= 2; $i++) {
$func = $var_name.$i;
echo $func($i) .'<br />';
}
임시 변수에 문자열 결합을 통해 함수명을 만들고 사용하면 됩니다.
주의 할점은 함수에 ${$var}() 형식으로는 사용할 수 없습니다.
함수까지 유동함수를 써봤는데 그렇다면 클래스는 어떨까요? :)
클래스 또한 마찬가지로 사용하면 됩니다.
class Test {
function show($v) {
echo $v ." showtime!<br />";
}
}
$class_name = 'Test';
$t = new $class_name;
$t->show("it's");
$method_name = 'show';
$t->$method_name("WoW");
WoW showtime!
사실 이렇게 프로그래밍 할 수 있다는 것이 PHP의 장점이자 단점입니다. 다른 언어에서는 지원되지 않는 독특한 문법이죠.
그러나 편하다고 잘못 쓰면 오히려 보안상 큰 헛점을 만들게 됩니다. 또한 너무 남용하는 것은 코드 분석 및 유지에 어려울 수 있습니다.
- HTML 폼에서 값을 받는 경우 유동변수가 아닌 배열을 사용하는 것이 좋습니다.
- 마찬가지로 GET 방식으로 값을 받을때 또한 유동변수 보다는 $_GET 변수를 사용하여 처리하는 것이 좋습니다.