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


問題

引数を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の動きとしては当然そうなんでしょうけど、非常にアレですよね