
どうもタスです。
プログラムは、変数に代入する数値や文字列などのリテラルを分類する「型」というものを使用します。
PHPは動的型付け言語のため、変数を使用する際に明示的に型を宣言する必要はないですが、全ての変数は型を持っていて、内部的には明確に分類されています。
そこで今回は、型のうちの一つである「boolean型」と「integer型」について説明します。
「float及びdouble」型についての説明は以下の記事を参考にしてください。
この記事の目次
PHPの10種類の基本型
PHPは、10種類の基本型をサポートしており、以下のとおりになります。
4種類のスカラー型
- 論理値:boolean
- 整数:integer
- 浮動小数点数:float, double
- 文字列:string
4種類の複合型
- 配列:array
- オブジェクト:object
- callable
- iterable
2種類の特別な型
- リソース:resource
- ヌル:NULL
変数の型は、その変数が使用される文脈に応じて、PHP が実行時に決定するため、基本的にプログラマが設定するものではありません。
式の型と値を正確に知りたい場合は、 var_dump()関数を使用して確認しましょう。
また、型をチェックする場合にはis_type()関数を使用しましょう。
ある変数の型を強制的に他の型に変換したい場合、変数を キャストするかsettype()関数を使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php $bool = TRUE; // boolean型の変数 $str = "tasu"; // string型の変数 $int = 12; // integer型の変数 echo gettype($bool); // boolean echo gettype($str); // string // 数値であれば4を足した結果を表示する if (is_int($int)) { echo ($int += 4); // 16 } // $boolが文字列であれば「String: $bool」と出力し、 // そうでなければ「Boolean: $bool」と出力する。 if (is_string($bool)) { echo "String: $bool"; } else { echo "Boolean: $bool"; } // 出力は「Boolean: 1」 |
論理値型「boolean」の説明
真偽の値を表す型を「boolean」と言います。
値は「TRUE」か「FALSE」のどちらかになります(大/小文字に依存しないため、どちらもでもOKです)。
FALSEとみなされる値は以下のとおりで、それ以外は全てTRUEとみなされます。
- booleanのFALSE
- integerの0(ゼロ)及び-0
- floatの0.0(零、点、零)及び-0.0
- 空文字列及び文字列の0(ゼロ)
- 要素数がゼロである配列
- Null(ヌル)
- 空のタグから作成されたSimpleXMLオブジェクト
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php var_dump(FALSE); // bool(false) var_dump(TRUE); // bool(true) var_dump((bool) 0); // bool(false) var_dump((bool) 1); // bool(true) var_dump((bool) -0.0); // bool(false) var_dump((bool) -1.0); // bool(true) var_dump((bool) ""); // bool(false) var_dump((bool) "tasuLife"); // bool(true) var_dump((bool) array()); // bool(false) var_dump((bool) array(10)); // bool(true) var_dump((bool) Null); // bool(false) |
整数型「integer」の説明
整数型を「integer」といい、10進数、16進数、8進数、2進数表記で指定可能です。
なお、10進数以外の表記方法は以下のとおりになります。
- 2進数:整数の前に「0b」(ゼロとb)を付ける。
- 8進数:整数の前に「0」(ゼロ)を付ける。
- 16進数:整数の前に「0x」(ゼロとx)を付ける。
また、オプションで符号を頭につけることも可能です。
1 2 3 4 5 6 7 |
<?php $a = 1234; // 10進整数 $a = -123; // 負の数 $a = 0123; // 8進数 (10進数の「83」と等価) $a = 0x1A; // 16進数 (10進数の「26」と等価) $a = 0b11111111; // 2進数 (10進数の「255」と等価) |
整数型のサイズとOSの関係
整数値のサイズはプラットフォームに依存しますが、32bit OSの約20億(2,147,483,647)が一般的な値です。
64bit OSの最大値は約900京(9,223,372,036,854,775,807)という天文学的数値になります。
ただしWIndowsは例外で、WindowsでPHP7.0より前のバージョンを使用すると32bit扱いになります。
なお、PHPは符号なし整数(unit)をサポートしていません。
整数の最大値は以下の定数で参照可能です。
- サイズ(バイト数):PHP_INT_SIZE(PHP 5.0.5以降で使用可能)
- 最大値:PHP_INT_MAX(PHP 5.0.5以降で使用可能)
- 最小値:PHP_INT_MIN(PHP 7.0.0以降で使用可能)
整数型のオーバーフローとPHPの解釈
整数値でオーバーフローした場合は、「integer型」ではなく「float型」に暗黙の変換が行われます。
integer型の最大値もしくは最小値を超える整数を指定した場合は、float型として解釈されます。
また、計算結果としてinteger型の最大値もしくは最小値を超える整数となる場合もfloat型として返されます。
integer型を超える数値を使用した場合は、float型に変換されることを覚えておきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php // 64bitOS $large_number = 9223372036854775807; var_dump($large_number); // int(9223372036854775807) $large_number = 9223372036854775808; var_dump($large_number); // float(9.2233720368548E+18) $large_number = 9223372036854775807; $large_number = $large_number + 1000000; var_dump($large_number); // float(9.2233720368558E+18) |
整数型の除算
PHPには、整数の除算はありません。よって、1/2(2分の1)はfloat型の0.5になります。
なお、0(ゼロ)へ近くなるように整数値を丸めるため、キャスト効果があります。
また、round()関数を使用して丸めモードを使用することもできます。
1 2 3 4 5 |
<?php var_dump(25/7); // float(3.5714285714286) var_dump((int) (25/7)); // int(3)→0に近い整数 var_dump(round(25/7)); // float(4)→roundのデフォルトは0より離れる方向へ丸める |
整数型以外の方から整数型への変換
integer型に明示的に変換するためには、「(int)または(integer)」のどちらかを使用してキャストしましょう。
ただし、演算子、関数、制御構造がinteger引数を必要とする場合は、値を自動的に変換するため、キャストの必要はありません。
関数intval()を用いて値を整数に変換することも可能です。
resourceをintegerに変換すると、その結果は一意なリソース番号になります。それはPHPが実行時に、resourceに対して割り当てた番号です。
booleanの場合は、FALSEは0(ゼロ)で、TRUEは1になります。
floatから整数に変換する場合は、値が0(ゼロ)に近い方に丸められます。
ただし、floatが整数の範囲を超える場合は、結果が「undefined」になります。これは、そのfloatが正しい整数の結果を得るために十分な精度を得られなかったためです。
なお、この場合はwarningもnoticeも発生しないので注意が必要です。
1 2 3 4 5 6 7 8 |
<?php echo (int)(0.7); // 0 echo (integer)(0.7); // 0 echo intval('10'); // 10 echo intval('10.6'); // 10 echo (int)(FALSE); // 0 echo (int)(TRUE); // 1 |