型の相互変換

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

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


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

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

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

本節の例をテストしたい場合には、例をカットアンドペーストし、 次の行を挿入して動作を自分で確認下さい。


 echo "\$foo==$foo; type is " . gettype( $foo ) . "<br>\n";
 	 

注意: 配列への自動変換の動作は、現在、未定義です。


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

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


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

PHP は文字列への添字を配列への添字と同じ構文で を使用してサポートしているため、 上の例は、 $a は最初の要素が "f" の配列となるのか "f" が文字列 $a の最初の文字になるのか? という問題を生じます。

このため、最新バージョンの PHP 3.0.12 および PHP 4.0b3-RC4 では、 この自動変換の結果は未定義(undefined)とみなします。 しかし、修正方法が議論されています。

型キャスト

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


$foo = 10;   // $foo は整数です
$bar = (double) $foo;   // $bar は倍精度実数です
      

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

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


$foo = (int) $bar;
$foo = ( int ) $bar;
      

型の間でキャストを行う際の動作は、必ずしも明確ではありません。 例えば、次の例を見てましょう。

スカラーまたは文字列変数から配列にキャストを行う時、 変数は配列の最初の要素になります。


 $var = 'ciao';
 $arr = (array) $var;
 echo $arr[0];  // 'ciao' を出力します。
         

スカラーまたは文字列変数からオブジェクトにキャストを行う時、 変数はオブジェクトの属性の一つになります。その属性の名前は 'scalar' になります。


 $var = 'ciao';
 $obj = (object) $var;
 echo $obj->scalar;  // 'ciao' を出力します。