PHP/型ジャグリング
表示
< PHP
型ジャグリング
[編集]型ジャグリングとは
[編集]PHPは動的型付け言語であり、型ジャグリング(型の自動変換)が発生します。これは特定の操作や状況でPHPが異なる型を自動的に変換する動作を指します。
比較時の型ジャグリング
[編集]比較演算子を使用した場合、PHPは値を自動的に型変換します。
<?php // 等しい (==) は型をチェックしない var_dump(123 == '123'); // bool(true) // 厳密な等しい (===) は型もチェック var_dump(123 === '123'); // bool(false) // == の場合、文字列が数値形式なら数値に変換 var_dump('123abc' == 123); // bool(true) // 文字列として比較 var_dump('123abc' == '123'); // bool(false) ?>
算術演算時の型ジャグリング
[編集]算術演算では、文字列が数値に変換されます。
<?php echo '10' + 5; // 15 echo '10 apples' + 5; // 15 (文字列の先頭が数値として解釈) echo 'apples' + 5; // 5 (文字列が数値として解釈されない場合、0に変換) ?>
関数呼び出し時の型ジャグリング
[編集]PHPの多くの組み込み関数は引数の型を自動的に変換します。
<?php $length = strlen(12345); // 数値が文字列に変換される echo $length; // 5 ?>
明示的な型変換
[編集]型ジャグリングを避けるには、明示的な型キャストを利用します。
<?php $number = '123'; $integer = (int)$number; // 明示的に整数型に変換 echo $integer; // 123 $boolean = (bool)$number; // 真偽値に変換 echo $boolean ? 'true' : 'false'; // true ?>
型ジャグリングの落とし穴
[編集]型ジャグリングは予期しない動作を引き起こす場合があります。
<?php // 配列と文字列の比較 var_dump([] == ''); // bool(true) // 文字列が数値に解釈される var_dump('0e12345' == '0'); // bool(true) ('0e12345' は数値0と解釈される) ?>
型ジャグリングを避けるためのポイント
[編集]- 厳密比較 (
===
と!==
) を使用する。 - 関数引数や変数に型を明示的に指定する。
- 厳密な型宣言を有効化する(
declare(strict_types=1);
)。
<?php declare(strict_types=1); function add(int $a, int $b): int { return $a + $b; } echo add(5, 10); // 15 // echo add('5', '10'); // 型エラー発生 ?>