はじめに
最近ちょっとPHPを触っています。
諸事情によりノンフレームワークのため、いわゆるメタプロっぽいものが必要になる機会があったので、可変変数についてまとめます。
利用しているPHPのバージョンは5系です。
※5系と7系では挙動の違いがあるようです。
詳細は以下
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.variable-handling.indirect
可変変数とは
名前をそのまま読むと、変化できる変数ということになりますが、変数はもともと中身を変えられるものなので何が???ってなりますよね。
可変変数は、値ではなく、「名前」を動的に変化させることができます。
受け取った文字列で、変数を定義する、などですね。
具体例
$fruits = Array
(
'banana' => 'ばなな',
'apple' => 'りんご',
'peach' => 'もも',
'pear' => 'なし',
'orange' => 'みかん'
);
上のような、フルーツを格納する連想配列があるとします。
これを、それぞれのキーの変数に再格納したい、というときに、
foreach ($fruits as $key => $value){
$$key = $value;
}
上のように書くことができます。
上記のコードで、
$banana
$apple
$peach
$pear
$orange
が定義され、それぞれ値が格納されます。
なので、
print $banana; // ばなな
print $apple; // りんご
print $peach; // もも
print $pear; // なし
print $orange; // みかん
というように出力できます。
$のあとに、文字列を渡すと、その変数が定義されるイメージです。
ただし、文字列リテラルをそのまま渡す場合、{}で囲む必要があるので注意です。
// これはだめ
// $'cherry'
// これなら、$cherryが定義される
${'cherry'};
また、呼び出し側も動的にできます。
// 通常の変数定義
$cherry = 'さくらんぼ';
// 動的な呼び出し
echo ${'cherry'}; //文字列を直接
echo ${'che'.'rry'}; //文字列結合でもok
// 一回変数に入れる場合
$name = 'cherry';
echo $$name;
// 定義と同じく、これはだめ
// echo $'cherry'
おわりに
これは、いわゆるメタプログラミングなどで利用されるもので、乱用するとコードが非常に読みづらくなります。
利用する際は、きちんとコメントをいれて、中のコードの詳細を読まなくても使えるようにしないと、負債になる可能性が高いです。用法用量を守って正しく利用しましょう。
参考記事
https://qiita.com/andrew954/items/b7e3b3f6d595cc655923
http://php.net/manual/ja/language.variables.variable.php