型を設定する方法
- 比較演算子(===)を使う
- 比較系関数の厳密比較オプションをtrueにする
- 引数の型宣言をする
- 返り値の型宣言をする
- strict_types=1を指定する
比較演算子(===)を使う
厳密な比較演算子は、
値だけでなく型も含めて一致するかどうかを判定
var_dump('123' === 123); // bool(false)
var_dump('123abc' === 123); // bool(false)
var_dump('abc' === 0); // bool(false)
比較系関数の厳密比較オプションをtrueにする
まとめる
引数の型宣言をする
PHPは関数の引数として受け入れるデータ型を指定できる
function doubleInt($int) {
return $int * 2;
}
echo doubleInt(5); // 10
整数を2倍にして返す関数
function doubleInt(int $int) {
// ↑この引数部分に「int」と記述すると型宣言できる
return $int * 2;
}
echo doubleInt(5); // 10
echo doubleInt('aaa'); // error
int型の5を引数で渡した場合は正常に動作しますが、
string型の'aaa'を渡した場合はエラーになります。
返り値の型宣言をする
PHPでは、
関数の返り値の型を指定することができる。
例えば、先ほどのdoubleInt()関数では
返り値はint型である想定なので、そのように型宣言する。
function doubleInt(int $int): int {
//↑この部分「: データ型」の形で返り値の型宣言をする
return $int * 2;
}
echo doubleInt(5); // 10
もし宣言した型と違う型を返した場合はエラーが発生.
下記はエラーとなる。
function doubleInt(int $int): int {
return 'aaa'; // 文字列'aaa'を返す
}
echo doubleInt(5); // error
この戻り値の型宣言をすることによって、
関数を複雑に作りこんだ時などに
自分の想定していないデータ型の値を返してしまう
ようなことを防ぐことができます。
また、
関数を使う側からしても、
返却されるデータの型が保証されている状態なので
安心して関数を使うことができます。
strict_types=1を指定する
前述の引数の型宣言と返り値の型宣言での
「宣言した型と違う型を渡す(返す)とエラーになる」
は正確には間違い。
PHPのデフォルトでは 弱い型付け の状態になっていて、
この状態だと
宣言した型と違う型を渡した(返した)としても
可能な限りは自動で型変換を行って処理を進める。
function doubleInt(int $int) { // 引数はint型で型宣言されている
return $int * 2;
}
echo doubleInt('5'); // 10
// string型の'5'を渡してもint型に自動変換されて処理される
echo doubleInt(true); // 2
// bool型のtrueを渡してもint型の1に自動変換されて処理される
このように、引数をint型として型宣言していたとしても、
string'5'やbooltrueはエラーとならずintに自動変換されて処理が行わる。
※string'aaa'やarray、objectなどintに
自動変換するのが無理な値の場合はエラーとなる
対処
declaer命令でstrict_types=1を指定することで
強い型付けの状態にすることができる。
PHPファイルの一番最初に
declare(strict_types=1);を1行書くだけ
先ほどのような宣言と違う型のデータを渡した(返した)場合には
必ずエラーが発生するようになる。
declare(strict_types=1); // 強い型付けの設定
function doubleInt(int $int) {
return $int * 2;
}
echo doubleInt('5'); // error
echo doubleInt(true); // error
基本的にはstryct_types=1を指定する習慣としたほうがよい。
暗黙的な型変換
プログラムの文脈に応じて自動で型を変換して処理をしてくれる場合がある。
$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) です