PHP入門 型の相互変換
PHPはデータ型に関しては比較的寛容な言語ですが、値を特定の型に強制的に変換(キャスト)する必要がある場合があります。その方法を解説しています。
暗黙的な変換
PHPでは、その時々の状況で値を適切なデータ型へ変換することで、「それぞれの文脈に応じてできるだけなんらかの処理をしよう」とします。これを型の暗黙的な変換と言います。
明示的な変換(キャスト)
厳密な比較や演算をしたい場合、暗黙的な変換がされると困る場合があります。そのような場合は、キャストという仕組みを使います。値を特定の型に
構文:キャスト
(データ型)値
利用可能なキャスト型
データ型 | 概要 |
---|---|
(int)、(integer) | 整数型へのキャスト |
(bool)、(boolean) | 論理型へのキャスト |
(float)、(double) | 浮動小数点型へのキャスト |
(string) | 文字列型へのキャスト |
(binary) | バイナリ文字列へのキャスト |
(array) | 配列へのキャスト |
(object) | オブジェクトへのキャスト |
<?php
var_dump((int)1530.95); //結果:int(1530) ➊
var_dump((int)-1530.95); //結果:int(-1530) ➋
var_dump((int)true); //結果:int(1) ➌
var_dump((string)true); //結果:string(1)"1" ➍
var_dump((int)false); //結果:int(0) ➎
var_dump((string)false); //結果:string(0)"" ➏
var_dump((array)108); //結果:array(1) { [0]=> int(108) } ➐
➊と➋は浮動小数点リテラルを整数型にキャストする例です。この場合、値は(四捨五入ではない)ゼロの方向に丸められます。
➌から➏は論理リテラルを数値や文字列にキャストしています。この場合、trueは1に変換されfalseは0または空文字列に変換されます。
➐スカラー型から配列型への変換です。この場合、数値/文字列/論理型のいずれであっても要素を1つだけ持つ配列ができあがります。
数値を文字列に変換する特殊な方法として、変数をダブルクォートでくくってもかまいません。ダブルクォートの中で変数が展開され、その結果は文字列とみなされます。
$x = 1;
var_dump("$x"); //結果:string(1) "1"
文字列→数値の型キャスト
<?php
var_dump((int)'0b11'); //結果:int(0) ➊
var_dump((int)'0777'); //結果:int(777) ➊
var_dump((int)'0xFF'); //結果:int(0) ➊
var_dump(bindec('0b11')); //結果:int(3) ➋
var_dump(octdec('0777')); //結果:int(511) ➋
var_dump(hexdec('0xFF')); //結果:int(255) ➋
var_dump((int)'1E4'); //結果:int(10000) ➌
var_dump((float)'1E4'); //結果:float(10000) ➌
➊のように’0b11’(2進数)や’0777’(8進数)、’0xFF’(16進数)をキャストした場合、いずれも正しく認識されず、先頭から数字として認識できる箇所までを抜き出します。よって、’0b11’であれば「b」の前までを抜き出し、0となるわけです。’0777’はすべて数字ですが、10進数と認識され、結果は777となります。これら2/8/16進数表現の文字列を正しく整数キャストするには、➋のような関数を利用してください。
n進数文字列を整数型に変換する関数
関数 | 概要 |
---|---|
bindec | 2進数を10進数に変換 |
octdec | 8進数を10進数に変換 |
hexdec | 16進数を10進数に変換 |
残る指数表現については問題ありません(➌)。int/float型共に正しく認識できます。