目次に戻る
この内容は次の「演算子」に掲載したいところでしたが、あまりにも内容が膨大になるので専用の回を設けることにしました。
キャスト(型変換)演算子とは
変数や値の 頭 につけることで、指定された型に強制的に変換するものです。大文字小文字は区別されません。
var_dump((int)'123');
int(123)
(string)
文字列型への変換を行います。同様の役割を strval 関数も担っています。
strval
http://php.net/manual/ja/function.strval.php
整数
- そのまま文字列になります。
浮動小数点数
- 小数部分で
0が続いているところは省略される - ある範囲を超過すると 科学表記 が強制される
-
NANやINFはそのまま文字列に
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" -
FALSENULL→""
配列
-
"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)
);
浮動小数点数
- 切り捨て を行う
- 精度が失われ、想定していない値になることがあるので注意
var_dump(
(0.1 + 0.7) * 10,
(int)((0.1 + 0.7) * 10)
);
float(8)
int(7)
-
NAN→-2147483648(32ビット環境) INF→0
TRUE FALSE NULL
-
TRUE→1 -
FALSENULL→0
配列
- 要素数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
-
TRUE→1.0 -
FALSENULL→0.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
);
整数・浮動小数点数
-
00.0→FALSE - それ以外 →
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に対する代入と等価
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に対する代入と等価
var_dump((array)false);
object(stdClass)#1 (1) {
["scalar"]=>
bool(false)
}
NULL
- 初期状態の
stdClass
配列
- キーと値が全て
publicプロパティとしてセットされる
【要注意】 名前が整数型のプロパティ・・・?
オブジェクトのプロパティ名は基本的には 文字列型 に限定されています。ところが、この (object) キャストによる場合でのみ、何とプロパティ名を整数型にできてしまいます。こうして作られたプロパティにはアロー演算子でアクセスすることは出来ません。
$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"
}