目次に戻る
この内容は次の「演算子」に掲載したいところでしたが、あまりにも内容が膨大になるので専用の回を設けることにしました。
キャスト(型変換)演算子とは
変数や値の 頭 につけることで、指定された型に強制的に変換するものです。大文字小文字は区別されません。
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"
-
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)
);
浮動小数点数
- 切り捨て を行う
- 精度が失われ、想定していない値になることがあるので注意
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
-
FALSE
NULL
→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
-
FALSE
NULL
→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
);
整数・浮動小数点数
-
0
0.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"
}