가변 변수

때로는 가변 변수 이름을 가질 수 있는 것이 편리합니다. 즉, 동적으로 설정하여 사용할 수 있는 변수 이름입니다. 일반 변수는 다음과 같은 명령문으로 설정됩니다.

                  
<?php
$a = 'hello';
?>
                  
                

가변 변수는 변수의 값을 취하여 변수의 이름으로 취급합니다. 위의 예에서 hello는 두 개의 달러 기호를 사용하여 변수 이름으로 사용할 수 있습니다. 즉.

                  
<?php
$$a = 'world';
?>
                  
                

이 시점에서 두 개의 변수가 정의되어 PHP 심볼 트리에 저장되었습니다. $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";

?>
                  
                

위의 예는 다음을 출력합니다.

I am bar.
I am bar.
I am bar.
I am r.
                

경고 가변 변수는 함수 또는 클래스 메서드 내에서 PHP의 슈퍼글로벌 배열과 함께 사용할 수 없습니다. $this 변수는 동적으로 참조할 수 없는 특수 변수이기도 합니다.