可変変数には{}をつけるべき
可変変数はスクリプト言語の醍醐味でしょう。
PHPの可変変数の扱いはとても便利で楽ちんです。
PerlやRubyと比べてもPHPが優位にいるんじゃないでしょうか。
しかもPHP5から追加された__SET,__GET,__CALLには、可変変数使わずして恩恵に預かれない。
このようなクラスがあるとき
<?php class Test{ public $sample; } $test = new Test(); $test->sample = "test0";
PHPの可変変数では、こう書ける
<?php //例1 $test->"sample" = "test01"; //例2 $str = "sample"; $test->$str = "test01";//可変変数 //例3 $test->{"sample"}= "test01"; //例4 $str = "sample"; $test->{$str}= "test01";//可変変数
メンバ変数が”配列”の場合注意が必要です
<?php #このようなクラスがあるとします class Test{ public $sample=array(); } $test = new Test(); $test->sample[] = "test0";//この処理を可変変数で書きます。
配列の場合。
PHPの可変変数では、Syntaxエラーになる場合があります。
配列へのアクセスは注意が必要。
<?php //例1 $test->"sample"[] = "test01";//エラー!! //例2 $str = "sample"; $test->$str[] = "test01";//エラー!! //例3 $test->{"sample"}[] = "test01";//ok!! //例4 $str = "sample"; $test->{$str}[] = "test01"; //OK!!
結論
可変変数(variable variables )は{}で囲む。これが無難。
<?php class Test{ public $sample; } $test = new Test(); $test->{"sample1"} = "test0"; $test->{"sample2"}[] = "test2";
まともな解説。
もうすこし突っ込んだ話。
PHPのマニュアルを参考にすると、
$test->$a[0]
こう書かれてしまうと、PHPは []がどちらに付くのか、判断付かない!!
$test->sample[0];
なのか
$test->sample[$a[0]]
判断できない。
だから{}をつけなさい。と書いてある。
でも、[0]と[]を同等に扱われるのはムカツク。
$test->$a[] = "test";
と書かれていれば、
$test->{$a}[] = "test";
と解釈できる。
$test->sample[$a[]] = "test0";
とは解釈できない。文法としてあり得ないです。
[0]はエラーだが。[]はエラーとする必要は無いとおもう。
ま、{}をつけた方が無難って事です。
ちなみに、これもエラー
$test->"sample"[0] = 1; //これもエラー
これも[]はどちらを修飾するか、明らかだ。エラーにするのは変だ。
参考:http://jp.php.net/language.variables.variable
テスト環境は、PHPVersion 5.2.1