配列型の整数キャストでハマったので、そもそもキャストがどのように行われるのか調べました。
参考になれば幸いです。
公式ドキュメント 型の相互変換
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
弊社で一緒に働く仲間を募集しています。
全てのオタクを幸せにしたい方、是非ご覧ください!