配列には同じ型のものだけを格納する

配列には同じ型のものだけを格納する

  • 調査中に下記の様なコードを見るとツライ気持ちになったりします
array(2) {
  [0]=>
  array(1) {
    ["foo"]=>
    int(1)
  }
  [1]=>
  object(stdClass)#1 (1) {
    ["foo"]=>
    int(2)
  }
}

何がよくないのか

  • 同様の値を保持している様に見えますが、配列とオブジェクトが格納されています
  • ループで扱おうとした際に配列であるかオブジェクトであるかを見るという処理が行われるケースも稀に見かけます
  • これが連想配列で適切なキー名が与えられているのであれば(おそらく)問題ありません
  • PHPが配列と連想配列を同じシンタクスで使えることや、配列を途中で連想配列に出来てしまうあたりも弊害として挙げられます
  • 配列を用意する側は利用する側に比べて多岐に渡るため、不要な処理を要求しない様に実装されるべきです

どうすればよかったか?

  • 格納時に配列にキャストしてしまう
  • より正しい対応方法は格納前の取得方法を見直すことですね
  • ジェネリクスを使える言語であれば、格納内容を指定することでこれを回避できます
  • ただし、ジェネリクスを使える言語でもObjectを指定しているケースは危険な状態です

伝えたいこと

  • 配列に型が違うものを格納しない
  • これは読み込む処理の実装が不要に複雑になってしまうからである
  • ジェネリクスを使える場合は正しく型を指定しましょう