LoginSignup
3
4

More than 3 years have passed since last update.

【PHP】PHPの型宣言は弱い型付け

Posted at

型宣言とは

次の例のように、関数に引数を与えるような場合などに引数の型に制約を与えることができます。
正しくない種類の型が渡された場合、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の引数$priceint型を指定しているため、正しい型である100を渡すことに成功しましたが、string型である税抜100円を渡した時にエラーを吐いています。

型宣言として使用有効な型は、以下の通りです。
スクリーンショット 2020-01-01 20.59.55.png

引用 PHPマニュアル > 言語リファレンス > 関数 > 型宣言

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で実装されるスカラー型宣言とは?


  1. 論理値 (boolean)整数 (integer)浮動小数点数 (float, double)文字列 (string)の4種類。 

  2. プロパティ型指定は7.4からの新機能。 

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4