開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. 【PHP】変数値を元にプロパティやメソッドにアクセスする
no-image

【PHP】変数値を元にプロパティやメソッドにアクセスする

こんにちは、スズキです。

知っておくと地味に便利だった小ネタシリーズです。

PHPで開発をしていると、プロパティ名を変数に入れておき、変数を元にプロパティにアクセスをしたい場合ってありますよね?
今回はこの方法を紹介します。


といっても、実は方法はいたって簡単です。
以下のようにしてプロパティにアクセスすることができます。
        // アクセスするプロパティ名を変数に格納する
        $FIELD_NAME = "name";
        $FIELD_DISTANCE = "distance";
        $FIELD_TEL = "tel";

        // 元データ
        $detailInfo = (object)[
            'name' => 'テストデータ',
            'distance' => 15 . "m",
            'price' => number_format(12345) . "円",
        ];

        // データを取得する
        $name = $detailInfo->$FIELD_NAME;
        // データを設定する
        $detailInfo->$FIELD_DISTANCE = 30 . "m";

        // もちろん、新たにプロパティを追加することも可能
        $detailInfo->$FIELD_TEL = "090-1111-2222";


メソッドについても同様に以下のようにアクセスが可能です。
    private function main()
    {
        // アクセスするメソッド名を変数に格納する
        $METHOD_TEST_VALUE = "getTestValue";
        $METHOD_TEST_VALUE_TYPE2 = "getTestValueType2";

        // メソッドにアクセス
        $testValue = $this->$METHOD_TEST_VALUE();
        // 引数が必要な場合もこの通り
        $testValueType2 = $this->$METHOD_TEST_VALUE_TYPE2("AAA", "SSS");
    }

    private function getTestValue()
    {
        return "テスト値です。";
    }

    private function getTestValueType2($value1, $value2)
    {
        return $value1 . "-" . $value2;
    }


ちなみに、以下のような形で配列にデータを追加しようとするとエラーが出てしまいます。
        // アクセスするプロパティ名を変数に格納する
        $FIELD_NAMES = "names";

        // 元データ
        $detailInfo = (object)[
            'names' => [],
        ];

        // このような形で配列データを追加しようとするとエラーが出てしまう
        $detailInfo->$FIELD_NAMES[] = "山田太郎";
上記ソースを書いていると実行した際に以下のようなエラーがでます。
        Cannot use [] for reading

これはおそらく、PHPが構文解析をする際に「$this-><<変数名>>[]」という内容を「$this->names[]」と解釈できないのが原因と思われます。
(※PHP5.6の環境で動作確認しています。PHPのバージョンが上がれば構文解析できるようになる(エラーが出なくなる)かもしれません。)

上記のように配列データを追加したい場合は仕方がないので、古い書き方であるarray_pushメソッドを利用した書き方にすると良いと思います。
        // アクセスするプロパティ名を変数に格納する
        $FIELD_NAMES = "names";

        // 元データ
        $detailInfo = (object)[
            'names' => [],
        ];

        // PHPが構文解析できるようにarray_pushメソッドを使って配列データを追加する
        array_push($detailInfo->$FIELD_NAMES, "山田太郎");
これでソースを実行してもエラーが出なくなりました。
  • posted by ナカエ
  • PHP
TOPに戻る