値を別の型に変換するには、その前に型を括弧で書きます:(int) "42"で整数の42になります。関数の形のintval("42")も同じです。キャストは失敗しません。数値でないテキストは0になり、数字で始まる文字列はその数字の部分だけが残ります。
PHPのキャストは(int)、(float)、(string)、(bool)、(array)、(object)です。それぞれ関数版もあります:intval()、floatval()、strval()、boolval()。
文字列をintに:(int)とintval()が返す値
PHPは先頭の空白を飛ばしたあと、文字列の最初から数字を読み、数値に当てはまらない最初の文字で止まります。指数表記は数値として扱われますが、0xの接頭辞は扱われません。
"12.7"が12になる点に注意してください。intへのキャストは小数部分を切り捨て、四捨五入はしません。入力が何であれ、ここでは(int)もintval()も警告を出しません。
基数付きのintval()
intval($value, $base)は、文字列を別の記数法で読みます。基数を0にすると、PHPは接頭辞を見ます:0xなら16進数、0bなら2進数、先頭の0なら8進数です。
floatからintへ:四捨五入ではなく切り捨て
(int)は小数点以下をすべて0の方向へ切り捨てます。いちばん近い整数が欲しいなら先に丸め、括弧に注意してください。
最後の組はfloatの定番の罠です。(0.1 + 0.7) * 10は7.999999...として保存されるので、切り捨てると7になります。先に丸めれば8です。round、floor、ceilについては数学関数のページで扱っています。
bool、string、arrayへのキャスト
boolへのキャストでfalseになるのは、0、0.0、""、"0"、null、[]のごく一部の値だけです。それ以外はすべてtrueで、"0.0"、" "、"false"もtrueです。
stringへのキャストでは、trueは"1"に、falseとnullはどちらも""になります。floatは末尾の.0が消え、非常に大きいか小さいfloatは指数表記になります。
配列を文字列にキャストしても結合はされません。次のコードはTags: Arrayと出力し、
<?php
$tags = ["php", "web"];
echo "Tags: " . $tags;
PHPは警告を追加します。
Warning: Array to string conversion in /home/index.php on line 3
配列をテキストにするにはimplode(", ", $array)かjson_encode($array)を使います。
すべてのキャストを一覧で
値を選ぶと、intval、(bool)、strval、is_numeric、gettypeがそれぞれ何を返すかがわかります。すべてのセルはPHP 8.3で計算したものです。
| $x | intval | bool | strval | is_numeric | gettype |
|---|---|---|---|---|---|
| "10" | |||||
| "1abc" | |||||
| "abc" | |||||
| "" | |||||
| " " | |||||
| "0" | |||||
| "0.0" | |||||
| "1e1" | |||||
| "010" | |||||
| 1.5 | |||||
| true | |||||
| false | |||||
| null | |||||
| [] | |||||
| [1, 2] |
数値文字列と自動変換
数値文字列とは、"12"、"-3.5"、"1e3"のように数値に見える文字列で、前後に空白があってもかまいません。PHPは算術演算でこれらを自動で変換し、is_numeric()で文字列がそれに当てはまるかを調べられます。
"12abc" + 1は今でも13になりますが、PHP 8はWarning: A non-numeric value encounteredを表示し、"abc" + 1はTypeErrorを投げます。ユーザーの入力で計算する前には、キャストするか検証しましょう。
settype()とgettype()
settype()は変数の型をその場で変え、gettype()は型を報告します。get_debug_type()は、エラーメッセージで目にする短い名前(int、float、string)を返します。
ほとんどのコードでは、短くて読みやすさも変わらないので、代わりにキャスト($value = (int) $value;)を使います。
キャストせずに入力を検証する
(int)は決して拒否しないので、(int) "abc"は黙って0になり、(int) "5 apples"は5になります。フォームの入力にはFILTER_VALIDATE_INTを指定したfilter_varを使いましょう。整数かfalseを返します。
0は正当な整数で、== falseだとそれを拒否してしまうので、結果は=== falseで比較します。範囲の指定やほかのバリデーターはfilter_varのページで紹介しています。
よくある質問
PHPで文字列をintに変換するには?
(int) $strかintval($str)を使います。10進数ならどちらも同じ結果です。(int) "42"は42、(int) "12abc"は12、(int) "abc"は0です。整数でない入力を拒否するには、推測せずにfalseを返すfilter_var($str, FILTER_VALIDATE_INT)を使います。
PHPのintval()と(int)の違いは何ですか?
10進数なら同じ結果を返します。intval()は基数も受け取れます:intval('ff', 16)は255で、基数を0にすると0x、0b、先頭の0(8進数)といった接頭辞を読み取ります。また関数なので、array_map('intval', $values)のようにコールバックとして渡せます。
PHPで(bool) "0"は何を返しますか?
falseです。文字列"0"は、""、0、0.0、null、[]と並ぶPHPのfalseと評価される値の1つです。それ以外の文字列はすべてtrueで、"0.0"、" "、"false"もtrueです。
PHPで数値を文字列に変換するには?
(string) $n、strval($n)を使うか、文字列の中に入れます:"$n"。(string) 3.0は"3"です。小数点以下の桁数を固定するにはnumber_format($n, 2)かsprintf('%.2f', $n)を使います。