📔

Laravel Carbonクラスでの注意点 copy()の活用

2022/05/30に公開

はじめに

Laravelにて、大変便利な日付を扱うライブラリ、Carbonを使用しました。
使用する上で、注意することがあったので、こちらに書き留めておきます。

Carbonとは

日時を扱うクラスであり、
DateTimeクラスを継承したクラスです。
Laravelには標準で搭載されているので、使いたいファイルで、useを記載して読み込めばすぐに使うことができます。
大元のDateTimeクラスを使ったことはないのですが、扱い安さ、バグの発生などを考えると、断然Carbonクラスを使った方が良いようです。

$request_date = "2021-06-01"

$date = new Carbon($request_date, 'Asia/Tokyo');

$dateの中身確認

Carbon\Carbon Object
(
    [date] => 2022-06-01 00:00:00.000000
    [timezone_type] => 3
    [timezone] => Asia/Tokyo
)

Carbonクラスのオブジェクトが生成されている。

Carbonクラスには色々なメソッドが用意されており、
1週間前、1週間後の日にちを取り出したり、その日にちの曜日を取得できたりする、大変便利なクラスです。

本題

例えば、一週前の日にちを取得したい場合、

$request_date = "2021-06-01"

$date = new Carbon($request_date, 'Asia/Tokyo');

 // 一週間前
$one_week_before_date = $date->subWeek();

上記のように記載することで、一週前のCarbonクラスのオブジェクトを作ることができる。

$one_week_before_dateの中身確認

Carbon\Carbon Object
(
    [date] => 2022-06-08 00:00:00.000000
    [timezone_type] => 3
    [timezone] => Asia/Tokyo
)

しかしながら、
上記実行後に、$dateを出力すると、

Carbon\Carbon Object
(
    [date] => 2022-06-08 00:00:00.000000
    [timezone_type] => 3
    [timezone] => Asia/Tokyo
)

あれ?
$one_week_before_dateと同じ??

そうです。
Carbonクラスのインスタンスに、日程を変更するメソッドを行うと、
元のインスタンスにも侵食してしまうようです

インスタンスを侵食しないようにするために

流石Carbonクラス、上記のことが起きないようにするメソッドがあります。

$request_date = "2021-06-01"

$date = new Carbon($request_date, 'Asia/Tokyo');

 // 一週間前
$one_week_before_date = $date->copy()->subWeek();

copy()メソッドを使用することによって、元のインスタンスのコピーを作成することができます。
よって、上記の記述では、コピーしたインスタンスの1週間後を$one_week_before_dateに入れております。
その結果、$dateのインスタンスには影響を及ぼしません。

さいごに

とても便利なCarbonクラス、Laravel使用時には、今後もお世話になりそうです。

Discussion