Open2

【PHP】Carbon::parseにNULL渡すとnowになるが、Carbon::makeならNULLが返るのでわかりやすい

meijinmeijin
    public function test仕様チェック_make関数とparse関数の挙動の差()
    {
        // make関数はnullを渡すとnullが返る
        $result = CarbonImmutable::make(null);
        self::assertNull($result);

        $result = CarbonImmutable::make('2022-09-15');
        self::assertSame('2022-09-15', $result->format('Y-m-d'));

        // parse関数はnullを渡すと現在時刻が返る
        $result = CarbonImmutable::parse(null);
        self::assertNotNull($result);

        // rescue関数内では例外が起きてもNULLを返してくれるので、NULL以外が渡ったときにも強い。例外の記録もしてくれる
        $result = rescue(fn () => CarbonImmutable::make('takeshi'));
        self::assertNull($result);

        $result = rescue(fn () => CarbonImmutable::parse('takeshi'));
        self::assertNull($result);

        $result = rescue(fn () => CarbonImmutable::parse('2022-09-15'));
        self::assertSame('2022-09-15', $result->format('Y-m-d'));
    }
meijinmeijin

要点

  • Carbon::parseにNULLを与えると現在時刻が入るので、User Inputなどをあまり事前ValidationしていなかったりNULLableで通している場面でうっかり現在時刻を使ってエンバグしかねない
    • 具体的には、後続処理でSQL書いていて、「ユーザーがDateを指定しているなら、そのDate以降のデータを返す」みたいな仕様だと、NULLを指定したらなぜか今日以降のデータになってほぼEmptyになってしまうバグが起きる
  • $userInputDate ? Carbon::parse($userInputDate) : nullだとなんというかダサい
  • Carbon::make($userInputDate)でOKだった
  • これでもInvalidなDate Stringだと実行時例外を吐いてしまうので、品質基準によるがライトに済ますならrescueヘルパを使うと例外記録だけやってくれて後続処理をNULLで続けてくれる