Carbonで日付を2つ作ったときに同じになってしまう現象 PHP

卓上カレンダーのチェックマーク
卓上カレンダーのチェックマーク フリー素材ぱくたそ(www.pakutaso.com)
  • URLをコピーしました!

PHPで日付の操作をおこなうときに利用する便利な Carbon
一般的に利用する date 関数などと違って、クラスなので、インスタンスを参照しているという意識が必要です。

今日から30日間有効なチケットのデータを作りたいとします。
例えばこういうソースコードがあったとします。

$start = new Carbon('2022-09-01 12:34:56');
$end = $start->addDays(30);

$ticket = array(
  'start_at' => $start->toString(),
  'end_at'   => $end->toString(),
);

なんとなく期待するのは、 $start が 9/1 で、 $end が 10/1 (9月は30日しかないので、10/1が30日後)だと思います。しかし、このデータは $start$end も 10/1 になります。理由は、$end には$start のインスタンスが入っていて、どちらも同じオブジェクトを参照しているためです。

Carbonはミュータブルです。オブジェクトが作成されたあとも状態を変えることができることを意味します。そのため、あとから設定した内容も、前の処理に反映されます。(本当かどうか確かめていないですが、きっとコンパイル時に最終結果を入れているんでしょうね!)

今回やりたいことをするには、 copy() を利用します。 copy() は、元のオブジェクトと同じ値の新しいインスタンスを作成します。これで問題解決です。

$start = new Carbon('2022-09-01 12:34:56');
$end = $start->copy()->addDays(30);

$ticket = array(
  'start_at' => $start->toString(),
  'end_at'   => $end->toString(),
);

ツチノコテクノロジーに開発・保守を発注しませんか?

Laravel・Flutterの開発・保守をツチノコテクノロジーに発注しませんか?

まずはZOOMで打ち合わせ

お申し込みはこちら

ツチノコテクノロジーでは一緒に働く仲間を募集しています!

完全リモートで働きたい方へ!

詳しくは以下をご覧ください。

ツチノコテクノロジー採用サイト

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ツチノコテックアカデミアの記事は、社内で誰かが質問してくれたことに回答したときに、ついでに記載しています!(^^)/
みんなの悩みを共有すれば、きっと誰かの役に立つと信じて更新しています!

目次