型の相互変換

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";
}
?>

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