それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

PHPの可変変数

可変変数には{}をつけるべき

可変変数はスクリプト言語の醍醐味でしょう。
PHPの可変変数の扱いはとても便利で楽ちんです。
PerlRubyと比べても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のクラスをPerlだと思った方が良いかも。

まともな解説。


もうすこし突っ込んだ話。

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