LoginSignup
0
2

More than 3 years have passed since last update.

PHP7とスカラー型宣言とわたくし(メモ)

Last updated at Posted at 2019-05-19

問題

引数をintで宣言しているのに、intではない値で関数を呼び出せてしまうのですが・・・
(なぜ例外が発生しないの?)

結論

・PHPファイルの先頭行に

declare(strict_types=1);

を書くと厳密な型チェックが行われるので、型宣言と異なる引数で実行しようとした場合、例外が発生する。ただし、有効になるのは

それを有効にしたファイル の中からの関数呼び出しだけです。

・コード規約等で「厳密な型チェックモードで開発する」ように取り決めておく

気持ち

せめてphp.ini で設定できるようにしてくれんか
ゆるい型でスカラー型宣言する意味、ある?

前提となる話(参考)

PHPマニュアル関連ページ

参考記事

具体例

以下のようなPiyoクラスがあり、hogeメソッドの第一引数はint型宣言しているので、
整数の1、2以外の引数でこのメソッドを呼び出した場合、例外が発生して欲しい気持ちです。


class Piyo{
    /**
     * @param int $fugaId
     * @param array $data
     * @return array
     */
    public function hoge(int $fugaId, array $data)
    {
        switch ($fugaId) {
            case 1:
                return $this->type1($data);
                break;
            case 2:
                return $this->type2($data);
                break;
            default :
                throw new \InvalidArgumentException();
                break;
        }
    }
}

以下の要領でテストを書く

class PiyoTest extends PHPUnit\Framework\TestCase{
    /**
     * @dataProvider hogeDataProvider
     * @param $fugaId
     */
    public function testHoge($fugaId){
        $object = new Piyo();
        $actual=$object->hoge($fugaId,[]);
        try{
            $this->assertTrue(is_array($actual));
        }catch(\Error $e){
            //本当は、型が違う場合はこっちを通ってほしい

        }catch(\Exception $e){
            //整数で、1、2以外の値の場合はここを通ってほしい
        }

    }

    /**
     * テストケース
     */
    public function hogeDataProvider()
    {
        return [
            [1],//当然成功してよい
            [2],//当然成功してよい
            [1.5],//成功してしまう
            ["1"],//成功してしまう
            ["2"],//成功してしまう
            [true],//成功してしまう
        ];
    }
}

コメント中にもある通り、1.5、"1"、TRUE、などは暗黙の型変換でintの1扱いとされるので、結果hogeメソッドは例外を発生させずに、正常に実行できてしまう。

PHPの動きとしては当然そうなんでしょうけど、非常にアレですよね

0
2
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
0
2