概要
- 新しいバージョンのPHPでは関数の引数の型を指定できる
- ただし型チェックの前にキャストが試みられて、その結果が指定された型に合致しない場合は
TypeError
が出る - なので以下のような場合は(少なくとも型チェックでは)エラーにならない
- 文字列型の引数に数値を与える場合
- 数値型のタイプが異なる場合
- 数値型の引数に与える文字列が数値として解釈可能な場合
- これらの挙動に
declare(strict_types=1)
は影響しない
通常は型チェックされない
以下のコードをコンソールで実行する。動作確認のため引数範囲のチェックは行っていない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
function dice($trials, $separator) { echo random_int(1, 6); for ($i = 1; $i < $trials; $i++) { echo $separator . random_int(1, 6); } echo PHP_EOL; } dice(5, ','); // 1,3,6,2,1 dice(5, 0); // 504040401 dice(2.1, ','); // 4,2,1 dice('2.1', ','); // 3,6,1 dice('five', ','); // 6 |
挙動は以下の通り。
- 文字列型を想定した引数に数値型の値をセットすると、文字列型にキャストされる
- 整数型を想定した引数に実数型の値をセットすると、整数型にキャストされる
- 数値型を想定した引数に文字列型をセットすると、
- 数値に変換できる場合はその数値にキャストされる
- 数値に変換できない場合は0として扱われる
引数の型を明示できるが一部キャストされる
以下のように引数の型を明示する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
function dice_checked(int $trials, string $separator) { echo random_int(1, 6); for ($i = 1; $i < $trials; $i++) { echo $separator . random_int(1, 6); } echo PHP_EOL; } dice_checked(5, ','); // 5,6,1,4,2 //dice_checked(5, 0); // 306020303 dice(2.1, ','); // 1,5,1 dice('2.1', ','); // 3,6,3 dice_checked('five', ','); // TypeError: Argument 1 passed to dice_checked() must be of the type int, string given |
挙動は以下の通り。
string
型の引数にint
型をセットすると、string
型にキャストされるint
型の引数にfloat
型の値をセットすると、int
型にキャストされるint
型の引数にstring
型の値をセットすると、- 数値表現の文字列ならキャストされる
- 数値表現の文字列でないなら
TypeError
になる
なお、ファイルの冒頭にdeclare(strict_types=1)
を加えても結果は変わらない。