4.

可変変数

編集

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

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

■可変変数の宣言

【構文】

$$可変変数名;

具体例

$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を使う方が一般的

関連

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 基本事項
  2. HTMLへの埋め込み
  3. 変数
  4. 可変変数
  5. 定数
  6. データ型
  7. キャスト
  8. エスケープ文字
  9. 配列
  10. 演算子
  11. 代入の際の注意点
  12. 条件分岐
  13. 繰り返し処理
  14. クラスとインスタンス
  15. コンストラクタ
  16. 関数
  17. スーパーグローバル変数
  18. スコープ
  19. staticについて
  20. yieldについて
  21. ファイルのアップロード方法
  22. DB接続方法
  23. SQL実行方法
  24. カプセル化の具体例
  25. 継承の構文
  26. オーバーライド
  27. ポリモーフィズム(多様性)の具体例
  28. 抽象クラス・メソッドの構文と具体例
  29. GET通信
  30. try catchで全てのエラーを拾う方法