#型宣言とは
次の例のように、関数に引数を与えるような場合などに引数の型に制約を与えることができます。
正しくない種類の型が渡された場合、Fatal error
が発生します。
<?php
function includeTax(int $price, bool $take_out = true) {
if ($take_out) {
return $price * 1.08;
} else {
return $price * 1.1;
}
}
includeTax(100, false); // 100
includeTax('税抜100円', false); // Fatal error: Uncaught TypeError: Argument 1 passed to includeTax() must be of the type int, string given
上記の関数inculdeTax
の引数$price
はint
型を指定しているため、正しい型である100
を渡すことに成功しましたが、string
型である税抜100円
を渡した時にエラーを吐いています。
#PHPの型宣言は厳格ではない
しかし、スカラー型1の型宣言の場合にはには落とし穴があります。
具体的には以下のような例のばあいです。
<?php
function includeTax(int $price, bool $take_out = true) {
// $priceは(int)100に変換される。
if ($take_out) {
return $price * 1.08;
} else {
return $price * 1.1;
}
}
// string型で渡す。
includeTax('100', false); // 100
// float型で渡す。
includeTax(100.5, false); // 100
どちらも、int
型に変換できる形だったので、関数に渡した時にint
型に黙って変換されて処理が行われました。
特に、後者のfloat
型で渡したときには、開発者は110.55
が返ってくることを期待しましたが、別の結果が帰ってきたことに困惑するかもしれません。
この挙動は、返り値の型宣言やプロパティ型指定2でも同様です。
#弱い型付けを無効にするには
厳格な型付けを望みたい場合、ファイルの先頭でdeclare(strict_types = 1)
を宣言します。
<?php
declare(strict_types = 1);
function includeTax(int $price, bool $take_out = true) {
if ($take_out) {
return $price * 1.08;
} else {
return $price * 1.1;
}
}
includeTax('100', false); // Uncaught TypeError: Argument 1 passed to includeTax() must be of the type int, string given
includeTax(100.5, false); // Uncaught TypeError: Argument 1 passed to includeTax() must be of the type int, string given
しかし、この厳格な型付けは全体には適応できません。厳格な型付けを望みたい個々のファイルごとに宣言する必要があります。
#参考文献
PHPマニュアル
はじめてのPHP
【導入決定!】PHP7で実装されるスカラー型宣言とは?