Php/docs/language.types.type-juggling

提供:Dev Guides
< Php
移動先:案内検索

型の相互変換

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

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

<?php$foo = "1";  // $foo は文字列 (ASCII 49) です$foo *= 2;   // ここでは、$foo は整数 (2) です$foo = $foo * 1.3;  // ここでは、$foo はfloat (2.6) です$foo = 5 * "10 Little Piggies"; // $foo は整数 (50) です$foo = 5 * "10 Small Pigs";     // $foo は整数 (50) です?>

最後の二つの例が奇妙に思える場合には、 数値形式の文字列 がどのようにして数値に変換されるかを見て下さい。

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

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

注意:

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

また、PHP では配列の添字と同じ構文を使用した文字列へのアクセスをサポートしているので、 次の例はあらゆるバージョンの PHP で成立します。

<?php$a    = 'car'; // $a は文字列です$a[0] = 'b';   // $a はここでも文字列ですecho $a;       // bar?>

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

型キャスト

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

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

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

  • (int), (integer) - 整数へのキャスト
  • (bool), (boolean) - 論理値へのキャスト
  • (float), (double), (real) - float へのキャスト
  • (string) - 文字列へのキャスト
  • (array) - 配列へのキャスト
  • (object) - オブジェクトへのキャスト
  • (unset) - NULL へのキャスト

(binary) によるキャストや b プレフィックスもサポートされています。 (binary) によるキャストは本質的には (string) と同じですが、それに依存すべきではありません。

(unset) によるキャストは PHP 7.2.0 以降推奨されなくなりました。 (unset) によるキャストは、値に NULL 値を代入することと同じです。 (unset) によるキャストは、PHP 8.0.0 で削除されました。

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

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

リテラル文字列や変数を、バイナリ文字列にキャストします。

<?php$binary = (binary) $string;$binary = b"binary string";?>

注意:

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

<?php$foo = 10;            // $foo は整数です$str = "$foo";        // $str は文字列です$fst = (string) $foo; // $fst も文字列です// これは、"they are the same"を出力しますif ($fst === $str) {    echo "they are the same";}?>

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