가변 변수 이름을 사용하는 것이 편리한 경우도 있습니다. 즉, 변수의 변수명을 동적으로 설정하여 사용할 수 있다. 일반 변수는 선언을 통해 설정됩니다. 예:
<?php $a = 'hello'; ?>
변수 변수는 일반 변수의 값을 변수 변수의 변수 이름으로 가져옵니다. 위의 예에서는 달러 기호($)를 두 개 사용한 후 hello를 변수 변수로 사용할 수 있습니다. 예를 들면 다음과 같습니다.
<?php $a = 'world'; ?>
이때 두 개의 변수가 정의됩니다. $a의 내용은 "hello"이고 $hello의 내용은 "world"입니다. 따라서 다음 문
<?php echo "$a ${$a}"; ?>
은 다음 문과 정확히 동일한 결과를 출력합니다.
<?php echo "$a $hello"; ?>
둘 다 hello world를 출력합니다.
배열에 가변 변수를 사용하려면 모호성을 해결해야 합니다. 이는 $$a[1]을 작성할 때 파서가 $a[1]을 변수로 원하는지, 아니면 $$a를 변수로 원하는지 여부를 알고 인덱스 [1] 값으로 변수를 추출해야 합니다. 이 문제를 해결하기 위한 구문은 첫 번째 경우에는 ${$a[1]}를 사용하고 두 번째 경우에는 ${$a}[1]을 사용하는 것입니다.
변경 가능한 속성 이름을 통해 클래스 속성에 액세스할 수도 있습니다. 변경 가능한 속성 이름은 호출 범위 내에서 확인됩니다. 예를 들어 $foo->$bar 표현식의 경우 $bar는 로컬 범위에서 구문 분석되고 해당 값은 $foo의 속성 이름으로 사용됩니다. $bar가 배열 셀인 경우에도 마찬가지입니다.
중괄호를 사용하여 속성 이름을 명확하게 구분할 수도 있습니다. 속성이 배열에 있는 경우, 속성 이름에 여러 부분이 포함된 경우, 속성 이름에 잘못된 문자(예: json_decode() 또는 SimpleXML)가 포함된 경우에 가장 유용합니다.
예제 #1 변수 속성 예
<?php class foo { var $bar = 'I am bar.'; var $arr = array('I am A.', 'I am B.', 'I am C.'); var $r = 'I am r.'; } $foo = new foo(); $bar = 'bar'; $baz = array('foo', 'bar', 'baz', 'quux'); echo $foo->$bar . "\n"; echo $foo->$baz[1] . "\n"; $start = 'b'; $end = 'ar'; echo $foo->{$start . $end} . "\n"; $arr = 'arr'; echo $foo->$arr[1] . "\n"; echo $foo->{$arr}[1] . "\n"; ?>
위 루틴은 다음을 출력합니다:
I am bar. I am bar. I am bar. I am r. I am B.
경고
PHP 함수에서 슈퍼전역 변수 클래스 메서드에서는 변경 가능한 변수로 사용할 수 없습니다. $this 변수도 특수 변수이므로 동적으로 참조할 수 없습니다.