この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:2
ページ更新者:atom
更新日時:2026-06-10 16:39:53

タイトル: 可変変数

可変変数とは、$変数に格納された文字列を変数名とみなす。

可変変数を使用することで、変数や関数名を動的に変更することが出来る。

■可変変数の宣言

【構文】

$$可変変数名;

具体例

$varName = "hello";
$$varName = "world";  // $hello = "world" と同じ意味

echo $varName;  // "hello"
echo $hello;    // "world"
echo $$varName; // "world"

動的なプロパティ参照

クラスのプロパティを動的に参照するときも可変変数の考え方が使えます。

class User {
    public $name = "Taro";
    public $email = "taro@example.com";
}

$user = new User();
$prop = "name";
echo $user->{$prop};  // "Taro"

$prop = "email";
echo $user->{$prop};  // "taro@example.com"

動的な関数呼び出し

function greet() {
    echo "Hello";
}

$func = "greet";
$func();  // "Hello"

// 配列形式(メソッド)
$obj = new SomeClass();
$method = "doSomething";
$obj->{$method}();

連想配列での代替

可変変数は強力ですが、コードが読みにくくなり、エディタの補完も効きません。多くの場合、連想配列の方が安全で読みやすいです。

// 可変変数(読みにくい)
$key = "name";
$$key = "Taro";
echo $name;

// 連想配列(推奨)
$data = [];
$key = "name";
$data[$key] = "Taro";
echo $data["name"];

典型的な利用シーン

  • 古いフレームワーク・テンプレートエンジンでの動的変数展開
  • 動的なフォームフィールドの処理(推奨は $_POST から連想配列で取得)
  • extract() 関数の挙動(連想配列のキーを変数として展開する関数)

extract() との関係

$data = [
    "name" => "Taro",
    "age" => 20,
];
extract($data);
echo $name;  // "Taro"
echo $age;   // 20

extractは内部的に可変変数と同じことをしています。ただし外部入力($_GET等)を直接extractすると変数汚染のリスクがあるため、本番では避けます。

注意点

  • 可読性が大きく落ちる。「どの変数が定義されているか」がコードを追わないと分からない
  • IDEの補完・静的解析が効かない
  • セキュリティリスク: ユーザー入力をそのまま変数名にしない
  • クラスのプロパティ動的アクセスは $obj->{$prop} と中括弧で囲うのが安全
  • 現代的なPHPでは可変変数より連想配列・オブジェクト・Reflectionを使う方が一般的

関連