PHP
メタプログラミング
動的変数
可変変数

【PHP】名前が動的に変化する変数を定義する【可変変数】


はじめに

最近ちょっと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