Edited at

【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みたいなチェック系の関数がもっと充実してたら良いのに。