Laravel Carbonクラスでの注意点 copy()の活用
はじめに
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