intval と int キャストの違い

2022-08-18
PHP

先日、会社で「intval と int キャストって、何が違うんですか?」と聞かれ、「ウヴォアー」ってなったので調査。

intval

https://www.php.net/manual/en/function.intval.php

型変換を行う関数なので、引数は mixed。知らなかったのだけど、第二引数があって、何進数なのかを指定できる。デフォルトは十進数。

intval のマニュアル内で int キャストについて言及されているのは次の箇所

Strings will most likely return 0 although this depends on the leftmost characters of the string. The common rules of integer casting apply.

「文字列はだいたい0を返す。最左翼にある文字に強く依存し、int キャストと同じルールに従う」 と書いてある。

integer casting

https://www.php.net/manual/ja/language.types.integer.php#language.types.integer.casting

int に値を明示的に変換するには、キャスト (int) または (integer) のどちらかを使用してください。しかし、多くの場合、演算子、関数、制御構造が int 引数を必要とする場合、値は自動的に変換されるため、 キャストを使用する必要はありません。 関数 intval() を用いて値を整数に変換することも可能です。

resource を int に変換すると、その結果は一意なリソース番号となります。 これは、その resource に対して PHP が実行時に割り当てた番号です。

型の相互変換 を参照ください。

おまけリンク

Type Juggling 型の相互変換

https://www.php.net/manual/ja/language.types.type-juggling.php

実際の比較

マニュアル上はよく分からないということになったので、動かしてみよう。

https://3v4l.org/JZ5bT

結果は、想定されるケースの大体において、一緒でした。

まとめ

intval と integer casting は実用上は大体一緒。

しかし、intval であれば進数指定も可能なので、2つの存在は等価ではないです。またマニュアル上も等価であることは示していませんでした。

※暇があったら、ソースコードの方も見てみます。