LoginSignup
3
1

More than 5 years have passed since last update.

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

Posted at

はじめに

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

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1