PHP
laravel
Carbon

【Carbon】createFromDate関数の引数補完がいい感じ

PHPerにはおなじみ(?)の日付ライブラリ、Carbon。
最近これを使う機会ができて、ドキュメント(英語)を見ながら「うおーっ」ってなっております。

何かと多機能ではありますが、使いどころの多そうなcreateFromDate関数の引数補完がめっちゃ賢いなと思ったのでシェアします。

createFromDate()の補完機能

実は引数なしでも使える

通常こんな感じですが

Carbon::createFromDate(2018, 9, 13);  // "2018-09-13 18:58:43"

実は引数なしだと、実行した日時の情報で補完してくれます。

Carbon::createFromDate();  // "2018-09-13 18:58:43"

一部だけ引数がある場合

Carbon::createFromDate(null, 12, null); // "2018-12-13 18:58:43"

引数を当てた部分だけ切り替わります。

実在しない日付の場合

Carbon::createFromDate(null, null, 31); // "2018-10-01 18:58:43"

そのまま出力されれば2018-09-31となりそうなところ。
9月31日は存在しないので、次月にうまく切り上げてくれます。かしこい。

使いどころ

引き継いだ案件で、こんな実装がされていましたが

// ①: nullの変数にデフォルト値を突っ込む処理
if(is_null($year))  { $year  = date("Y"); }
if(is_null($month)) { $month = date("n"); }
if(is_null($day))   { $day   = date("j"); }

// ②: ①を引数に取る
Carbon::createFromDate($year, $month, $day);

①はすでに組み込まれているということですね。
すっきり実装できてよろしい。

now()やtoday()との違いは?

今後の参考にと思って、一応確かめました。

$date  = Carbon::createFromDate();  // "2018-10-01 18:58:43"
$now   = Carbon::now();             // "2018-10-01 18:58:43"
$today = Carbon::today();           // "2018-10-01 00:00:00"

引数なしのcreateFromDate()は、now()と同等と見て良さそうです。
today()は時刻がリセットさせていますね。

ちなみに、

$date === $now //false

// stringにキャストしてみる
(string)$date === (string)$now  //true

全く一緒ではないみたい。なんだろ?

さいごに

checkdateみたいなチェック系の関数がもっと充実してたら良いのに。