Web aym.pekori.to

型の相互変換

PHP は、変数定義時に明示的な型定義を必要と(または、サポート) しません。ある変数の型は、その変数が使用される文により定義されます。 これは、ある文字列を変数 var に代入した場合には、 var は文字列になることを意味しています。 ある整数値を var に代入した場合には、 その変数は整数になります。

PHP の自動型変換の例の一つは、加算演算子 '+' です。 オペランドのどれかが float の場合、全てのオペランドは float として評価され、結果は float になります。 その他の場合、オペランドは整数として解釈され、結果も整数になります。 この自動型変換は、 オペランド自体の型を変更するものではないということに注意してください。 変わるのは、オペランドがどのように評価されるかだけです。

$foo = "0";  // $foo は文字列です (ASCII 48)
$foo += 2;   // ここでは、$foo は整数です (2)
$foo = $foo + 1.3;  // ここでは、$foo はfloatです (3.3)
$foo = 5 + "10 Little Piggies";    // $foo は整数です (15)
$foo = 5 + "10 Small Pigs";   // $foo は整数です (15)

最後の二つの例が奇妙に思える場合には、 文字列変換 を参照ください。

ある変数を強制的にある特定の型として評価させたい場合には、 型キャスト のセクションを参照ください。ある変数の型を変更したい場合には、 settype() を参照してください。

本節の例をテストしたい場合には、 var_dump() を使用することが可能です。

注意: 配列への自動変換の動作は現時点で定義されていません。

<?php
$a
= 1;       // $a は整数です
$a[0] = "f";  // $a は配列になり、$a[0] には "f" が入ります
?>

上の例で明らかに $a は配列になりますが、最初の要素は 'f' になります。 次の例を見てみましょう。

$a = "1";     // $a は文字列です。
$a[0] = "f";  // 文字列オフセットは何ですか? どうなりますか?

(歴史的な経緯により) PHP は文字列への添字を配列への添字と同じ構文を使用してサポートしているため、 上の例は、$a は最初の要素が "f" の配列となるのか "f" が文字列 $a の最初の文字になるのかが不明であるという問題を生じます。

上の例の 2 番目のケースは、現在の PHP では文字列オフセットの指定と解釈されるので、 $a は "f" となります。しかし、この自動変換機能は未定義の動作と見なされるべきです。 PHP 4 からは、中カッコ ({}) が文字列内の文字を取得 / 更新するために利用できますので、代わりにこれを使った方がよいでしょう。

<?php
$a    
= "abc"; // $a は文字列
$a{1} = "f";   // $a は"afc"
?>

詳細は、 文字として文字列をアクセスするというセクションを参照してください。

型キャスト

PHP の型キャストは、C 言語と同様に動作します。つまり、 変換しようとする型を括弧で括り、キャストする変数の前に置きます。

<?php
$foo
= 10;   // $foo は整数です
$bar = (boolean) $foo;   // $bar はbooleanです
?>

使用可能なキャストを以下に示します。

括弧の中でタブとスペースを使用することができることに注意してください。 したがって、次の文は機能的に等価です。

<?php
$foo
= (int) $bar;
$foo = ( int ) $bar;
?>

注意: ある変数を文字列にキャストする代わりに、 二重引用符で括ることもできます。

<?php
$foo
= 10;            // $foo は整数です
$str = "$foo";        // $str は文字列です
$fst = (string) $foo; // $fst も文字列です

// 以下は、"they are the same"を出力します
if ($fst === $str) {
    echo
"they are the same";
}
?>

型の間でキャストを行う際の動作は、必ずしも明確ではありません。 詳細については、以下の節を参照ください。