#変数を動的に作成する(可変変数)
変数を動的に作成したら楽なのにな…と思うけど案外使っている方が少なかった?ので記録として。
例えばPHPの場合、変数の初期化宣言をしなくても代入を書いてしまえば使えてしまうわけですが、以下のように初期化宣言している場合です。
$apple = "";
$peach = "";
$grape = "";
上記のような例はよく見られると思います。
場合によってはもっと多くの変数を宣言しないといけない…なんて事もあるかもしれません。
これを動的に作成する方法は以下のようになります。
$arr = array(
"apple",
"peach",
"grape"
);
foreach ($arr as $value) {
${$value} = "";
}
${}
の中にforeachでloopしたvalueを入れてあげることでtest.phpとやっていることは同じになります。
コード量増えたじゃん!って思うかもですが、稀にtest.phpのように初期化処理を行っているプログラムで10個も20個も初期化処理を頑張って書いているのを見たことがあります。
そんな時にこれを使えば4行くらいで書けてしまいます。
//各変数の初期化処理
などとコメントを入れておくと「ここで変数の初期化やってるんだな」くらいに見て貰えると思います。
ちょっと追記
後輩にこれだけ見せても理解できません!って言われたのでもう少し詳しく解説。
$arr
の中にはapple
、peach
、grape
。この値が入っていることは見ての通りと思います。
例えばこれを普通にforeach
でloopしてvalueをprint
で表示するとapple
、peach
、grape
…の順番に表示されますよね?
処理の最初apple
をデバッグ風に表現するとしたら以下のようになると思います。
foreach ($arr as $value) {
${apple} = "";
}
$value
の部分にapple
が入りましたね。
これは普通のforeach
の動きと一緒になります。
問題は${apple}
の部分だと思います。
PHPで変数の宣言等は$
をつけて行います。
では上記の${apple}
はというと…?
実は$apple
と同じ意味となります。
では先ほど挙げた構文を今の例を踏まえてさらに砕いていくと
foreach ($arr as $value) {
$apple = "";
}
こうなるわけです。
これが、続いてpeach
、grape
と配列の最後まで続く為、冒頭で挙げたtest.php
と同じ意味となる。と言うわけです。
##動的変数(可変変数)応用編
先ほどまでは$arr配列の中身の変数をそのまま作っていました。
この変数を元に、更に別の変数を作ってみましょう。
$arr = array(
"apple",
"peach",
"grape"
);
foreach ($arr as $value) {
${$value} = "";
${$value . "_flg"} = true;
}
ここでは.
と""
でくくった文字列を連結することで配列の中身を元に
$apple = "";
$apple_flg = true;
$peach = "";
$peach_flg = true;
$grape = "";
$grape_flg = true;
このような変数宣言と同様の事が出来ます。
上記のような例では変数宣言を単純にしているだけですが、配列で使用することで世界が広がるかと思います。
上記は単純に変数を作っているだけですが、実はClassも同様に生成できたり実行できたりします。
ぜひ試してみてください。