可変変数
変数名を可変にできると便利なことが時々あります。可変変数では、変数 名を動的にセットし使用できます。通常の変数は、次のような命令でセッ トします。
<?php$a = 'hello';?>
可変変数は、変数の値をとり、変数の名前として扱います。上の例では、 hello は、ドル記号を二つ使用することにより、 変数の名前として使用することができます。つまり、
<?php$$a = 'world';?>
ここまでで、二つの変数が定義され、PHP シンボルツリーに定義されてい
ます。これらは、"hello" を値とする$a
と "world"
を値とする$hello
です。そこで、次の命令
<?phpecho "$a ${$a}";?>
の出力は、次の命令と全く同じとなります。
<?phpecho "$a $hello";?>
すなわち、両方共、hello worldを出 力します。
可変変数を配列で使用する際には、曖昧さの問題を解決する必要がありま
す。つまり、$$a[1]
と書いた場合、
$a[1]
を変数として使用したいのか、
$$a
を変数とし [1] を変数の添え字としたいのかを、
パーサが知る必要があるのです。この曖昧さを解決するには、前者では
${$a[1]}
とし、後者では
${$a}[1]
とする構文を用います。
クラスのプロパティには、可変プロパティ名でアクセスすることができます。
可変プロパティ名の解決は、呼び出し元のスコープで行われます。
たとえば $foo->$bar
のようにするとローカルスコープで
$bar
を調べ、その値を
$foo
のプロパティ名として使います。
$bar
が配列へのアクセスであっても同じです。
波括弧を使って、プロパティ名の区切りを明確にすることもできます。 これが特に有用なのは、配列が格納されているプロパティにアクセスするときや プロパティ名が複数のパーツからなる場合、 あるいはプロパティ名として無効な文字を含む場合 (たとえば json_decode() や SimpleXML に由来するプロパティ) などです。
例1 可変プロパティの例
<?phpclass 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
も特別な変数であり、
動的に参照することはできません。