コンテンツにスキップ

PHP/型ジャグリング

出典: フリー教科書『ウィキブックス(Wikibooks)』
< 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'); // 型エラー発生
?>