【PHP】変数値を元にプロパティやメソッドにアクセスする
こんにちは、スズキです。
知っておくと地味に便利だった小ネタシリーズです。
PHPで開発をしていると、プロパティ名を変数に入れておき、変数を元にプロパティにアクセスをしたい場合ってありますよね?
今回はこの方法を紹介します。
といっても、実は方法はいたって簡単です。
以下のようにしてプロパティにアクセスすることができます。
メソッドについても同様に以下のようにアクセスが可能です。
ちなみに、以下のような形で配列にデータを追加しようとするとエラーが出てしまいます。
これはおそらく、PHPが構文解析をする際に「$this-><<変数名>>[]」という内容を「$this->names[]」と解釈できないのが原因と思われます。
(※PHP5.6の環境で動作確認しています。PHPのバージョンが上がれば構文解析できるようになる(エラーが出なくなる)かもしれません。)
上記のように配列データを追加したい場合は仕方がないので、古い書き方であるarray_pushメソッドを利用した書き方にすると良いと思います。
知っておくと地味に便利だった小ネタシリーズです。
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, "山田太郎");これでソースを実行してもエラーが出なくなりました。