Edited at

【PHP入門講座】 型変換

More than 5 years have passed since last update.


目次に戻る

この内容は次の「演算子」に掲載したいところでしたが、あまりにも内容が膨大になるので専用の回を設けることにしました。


キャスト(型変換)演算子とは

変数や値の につけることで、指定された型に強制的に変換するものです。大文字小文字は区別されません。


PHPコード

var_dump((int)'123');



実行結果

int(123)



(string)

文字列型への変換を行います。同様の役割を strval 関数も担っています。

strval

http://php.net/manual/ja/function.strval.php


整数


  • そのまま文字列になります。


浮動小数点数


  • 小数部分で 0 が続いているところは省略される

  • ある範囲を超過すると 科学表記 が強制される


  • NANINF はそのまま文字列に


PHPコード

var_dump(

(string)-1.1,
(string)1.0,
(string)999999999999.0,
(string)INF
);


実行結果

string(4) "-1.1"

string(1) "1"
string(7) "1.0E+20"
string(3) "INF"


TRUE FALSE NULL

FALSE の扱いが配列キー上の変換規則と異なることに注意してください。



  • TRUE"1"


  • FALSE NULL""


配列



  • "Array" ( Notice を発生)


オブジェクト

※ この項目には未学習の内容が含まれています。


  • マジックメソッド __toString が実装されている場合、その返り値

  • 実装されていない場合は Catchable Fatal Error が発生


リソース



  • "Resource id #番号" の形式


(int) (integer)

整数型への変換を行います。同様の役割を intval 関数も担っていますが、こちらは第2引数を指定すればさらに違った使い方が出来ます。ここではリンクだけの紹介とさせていただきます。

intval

http://php.net/manual/ja/function.intval.php


文字列


  • 左から整数として有効な文字が続く分だけが対象

  • 空文字列 → 0

var_dump(

(int)'+1.8', // int(1)
(int)'++1.8', // int(0)
(int)'5 pencils', // int(5)
(int)'1e2x', // int(1)
(int)'1e2' // int(1)
);


浮動小数点数



  • 切り捨て を行う

  • 精度が失われ、想定していない値になることがあるので注意


PHPコード

var_dump(

(0.1 + 0.7) * 10,
(int)((0.1 + 0.7) * 10)
);


実行結果

float(8)

int(7)



  • NAN-2147483648 (32ビット環境)

  • INF0


TRUE FALSE NULL



  • TRUE1


  • FALSE NULL0


配列


  • 要素数1以上 → 1

  • 要素数0 → 0


オブジェクト



  • 1 ( Notice を発生)


リソース


  • リソースID


(float) (double)

浮動小数点数型への変換を行います。同様の役割を floatval 関数と doubleval 関数も担っています。


文字列


  • 左から浮動小数点数として有効な文字が続く分だけが対象


  • 0 を省略して小数点からの記述も認められる


  • 科学記法 も認められる

  • 空文字列 → 0.0

var_dump(

(float)'90% OFF sale', // float(90.0)
(float)'.1', // float(0.1)
(float)'-.1', // float(-0.1)
(float)'1e2x', // float(100)
(float)'1e2' // float(100)
);


整数



  • 整数.0 の形式


TRUE FALSE NULL



  • TRUE1.0


  • FALSE NULL0.0


配列


  • 要素数1以上 → 1.0

  • 要素数0 → 0.0


オブジェクト



  • 1.0 ( Notice を発生)


リソース



  • 番号.0 の形式


(bool) (boolean)

論理型への変換を行います。同様の役割を boolval 関数も担っています(PHP5.5以降)。

boolval

http://php.net/manual/ja/function.boolval.php


文字列



  • "0"""FALSE

  • それ以外 → TRUE

var_dump(

(bool)'0', // FALSE
(bool)'', // FALSE
(bool)'0.0', // TRUE
(bool)'00', // TRUE
(bool)'-0', // TRUE
(bool)'true', // TRUE
(bool)'false' // TRUE
);


整数・浮動小数点数



  • 0 0.0FALSE

  • それ以外 → TRUE

var_dump(

(bool)0, // FALSE
(bool)0.0, // FALSE
(bool)-0, // FALSE
(bool)1, // TRUE
(bool)-1, // TRUE
(bool)INF, // TRUE
(bool)NAN // TRUE
);


NULL


  • FALSE


配列


  • 要素数1以上 → TRUE

  • 要素数0 → FALSE


オブジェクト・リソース


  • TRUE


(array)

配列型への変換を行います。


文字列 整数 浮動小数点数 TRUE FALSE リソース


  • キー 0 に対する代入と等価


PHPコード

var_dump((array)false);



実行結果

array(1) {

[0]=>
bool(false)
}


NULL


  • 要素数0の配列


オブジェクト

※ この項目には未学習の内容が含まれています。


【要注意】

全てのプロパティが連想配列形式で格納されます。値はそのままですが、キーがかなり変則的です。新しく代入されるキーを $key 、もとのプロパティ名を $property_name とすると、下記のような結果になります。


public

$key = $property_name;


private

$key = "\0" . __CLASS__ . "\0" . $property_name; 


protected

$key = "\0" . '*' . "\0" . $property_name; 


(object)

※ この項目には未学習の内容が含まれています。

基本クラス stdClass 型への変換を行います。


文字列 整数 浮動小数点数 TRUE FALSE リソース



  • public プロパティ scalar に対する代入と等価


PHPコード

var_dump((array)false);



実行結果

object(stdClass)#1 (1) {

["scalar"]=>
bool(false)
}


NULL


  • 初期状態の stdClass


配列


  • キーと値が全て public プロパティとしてセットされる


【要注意】 名前が整数型のプロパティ・・・?

オブジェクトのプロパティ名は基本的には 文字列型 に限定されています。ところが、この (object) キャストによる場合でのみ、何とプロパティ名を整数型にできてしまいます。こうして作られたプロパティにはアロー演算子でアクセスすることは出来ません


PHPコード

$obj = (object)array('A');

$obj->{'0'} = 'B';
var_dump($obj);
$obj->{0} = 'C';
var_dump($obj);


実行結果

object(stdClass)#1 (2) {

[0]=>
string(1) "A"
["0"]=>
string(1) "B"
}
object(stdClass)#1 (2) {
[0]=>
string(1) "A"
["0"]=>
string(1) "C"
}