LoginSignup
1
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-12-08

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

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

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0