クマの手も借りたい
馬とテニスとリラックマが好きな IT 系のエンジニアです。
PHP

PHPのStdClassで動的なプロパティ名を扱う

普段は連想配列派なのですが、既存のコードを触っていると StdClass のオブジェクトに遭遇することが時々あります。

それ自体は問題ないのですが、プロパティ(メンバー変数)が連番になっていたりするとループして初期化したくなります。

でも StdClass のプロパティって動的に扱うことができたっけ?っとよく忘れるので備忘録。

連想配列の場合

name_1 から name_5 の 5 つの値を例に考えてみましょう。

name_1 や name_2 には数値が入り、0 で初期化しておきたいと仮定します。

name_1 => 0;
name_2 => 0;
name_3 => 0;
name_4 => 0;
name_5 => 0;

連想配列のループならキー名さえ動的に扱えればいいので以下のように定義できます。

$list = [];
for ($i = 1; $i <= 5; $i++) {
  $list['name_' . $i] = 0;
}

$list = [];
for ($i = 1; $i <= 5; $i++) {
  $list["name_$i"] = 0;
}

$list = [];
for ($i = 1; $i <= 5; $i++) {
  $list["name_{$i}"] = 0;
}

キーの定義の仕方は人それぞれなので、自分のお気に入りの書き方か、プロジェクトの既存ソースに合わせておくといいでしょう。

結果はいずれも下の通りです。

Array
(
  [name_1] => 0
  [name_2] => 0
  [name_3] => 0
  [name_4] => 0
  [name_5] => 0
)

StdClassの場合

StdClass の場合も以下のようにできるかな?やってみます。

$list = new StdClass;
for ($i = 1; $i <= 5; $i++) {
  $list->name_{$i} = 0;
}

これだと下のような結果になってしまいます。

stdClass Object
(
  [name_] => Array
    (
      1 => 0
      2 => 0
      3 => 0
      4 => 0
      5 => 0
    )
)

StdClass の場合はプロパティ全体を {} で囲む必要があります。

$list = new StdClass;
for ($i = 1; $i <= 5; $i++) {
  $list->{'name_' . $i} = 0;
}

このように定義すれば思った通りの結果になります。

stdClass Object
(
  [name_1] => 0
  [name_2] => 0
  [name_3] => 0
  [name_4] => 0
  [name_5] => 0
)
Web API The Good Parts

オライリーの「Web API」に特化した本です。最近の多くの Web サービスは API が活用されていますが、その技術はこれまでの Web サイトとそれほど大きく変わりません。

今後、マイクロサービス化が進む中で知っておいて損はない内容が詰め込まれており、現場のエンジニアやこれから Web 系のエンジニアを目指す人にもオススメの一冊です。

created by Rinker
¥2,376
(2018/09/20 11:58:13時点 Amazon調べ-詳細)

あなたにオススメ