【PHP】配列型の整数キャストは論理キャストの結果が使われている


配列型の整数キャストでハマったので、そもそもキャストがどのように行われるのか調べました。
参考になれば幸いです。
公式ドキュメント 型の相互変換

array(array())の整数型は1

array(array())を整数へ型キャストした結果は1です。

var_dump((int) array(array())); // int(1)

どうして1になるの?

整数への型キャストについて

公式ドキュメントでは「booleans」「浮動小数点数」「文字列」「NULL」からの変換について説明された後、下記の警告が記述されています。

公式ドキュメント 整数への変換より

警告
整数への変換の動作は、他の型については定義されません。現在の動作は、その値がまず論理値に変換された場合と同じです。しかし、この動作は予告なく変更されることがありえるので、これを前提にしてはいけません。

その他の型は「その値がまず論理値に変換された場合と同じ」とあります。
つまり、その他の型はまず論理値に変換され、その結果をもとに整数へ型キャストされるという事です。

booleans から
false は、0 (ゼロ) となり、 true は、1 となります。

論理値を整数へ型キャストした結果は0もしくは1です。
その他の型を整数へ型キャストした場合も同様の結果となります。

論理値に変換とは?

(bool)または(boolean)などによる型キャストのことです。
公式ドキュメント booleanへの変換

まずarray(array())を論理型へ型キャストするとtrueになります。

var_dump((bool) array(array())); // bool(true)

bool に変換する場合、次の値は false とみなされます。

boolean の false
integer の 0 (ゼロ)
float の 0.0 および -0.0 (ゼロ)
空の文字列、 および文字列の "0"
要素の数がゼロである 配列
特別な値 NULL (値がセットされていない変数を含む)
属性がない空要素から作成された SimpleXML オブジェクト。つまり、子要素も属性もない要素です。

その他の値は全て true とみなされます (全ての resource および NAN を含みます)。

要素数がゼロの配列はfalseとみなされますが、空配列や0でも何かしらの要素があればtrueとみなされます。

var_dump((bool) array());        // bool(false)

// 要素の内容までは考慮されない
var_dump((bool) array(array())); // bool(true)
var_dump((bool) array(0));       // bool(true)

1になる理由

  • 配列型における整数への型キャストは、まず論理型へ型キャストされてから実行される
  • array(array())を論理型へ型キャストした結果はtrue
  • trueを整数へ型キャストした結果は1
  • よって、array(array())を整数へ型キャストした結果は1になる

気をつけたいこと

関数の戻り値をそのままキャストした場合、戻り値の型が想定外だと意図しない結果になるかもしれません。
関数がネストして最終的な戻り値がarray(array())になってしまう時など...

  • 戻り値の型の種類を把握する
  • そもそも関数に戻り値の型を明記する
  • 戻り値で想定外の型を受け取った場合の処理も記述する

採用PR

弊社で一緒に働く仲間を募集しています。
全てのオタクを幸せにしたい方、是非ご覧ください!