PHP Carbon类改变了我原来的变量值

问题描述 投票:16回答:3

我正在尝试在我正在创建的日历类型的东西中制作一些导航按钮,并且我使用碳来创建日期。

这是控制器中的代码:

if ($date == null) {
    $date = \Carbon\Carbon::now();
} else {
    $date = \Carbon\Carbon::createFromFormat('Y-m-d', $date);
}
$navDays = [
    '-7Days' => $date->subDay('7')->toDateString(),
    '-1Day'  => $date->subDay('1')->toDateString(),
    'Today'    => $date->today()->toDateString(),
    '+1Day'  => $date->addDay('1')->toDateString(),
    '+7Days' => $date->addDay('7')->toDateString()
];

然后我是我的看法,我这样做:

@foreach($navDays as $key => $i)
    <li>
        <a href="/planner/bookings/{{ $i }}" class="small button">
            {{ $key }}
        </a>
    </li>
@endforeach

这个问题是,碳似乎在数组创建期间改变了$ date,因为这些是我得到的日期(将$date设置为2015-11-29):

<ul class="button-group even-5">
    <li><a href="/planner/bookings/2015-11-22" class="small button">-7Days</a></li>
    <li><a href="/planner/bookings/2015-11-21" class="small button">-1Day</a></li>
    <li><a href="/planner/bookings/2015-12-22" class="small button">Today</a></li>
    <li><a href="/planner/bookings/2015-11-22" class="small button">+1Day</a></li>
    <li><a href="/planner/bookings/2015-11-29" class="small button">+7Days</a></li>
</ul>

有人知道我做错了什么吗?

php laravel php-carbon
3个回答
34
投票

当您针对Carbon对象运行这些方法时,它会更新对象本身。因此,addDay()有朝一日将碳的价值移动。

这是你需要做的:

$now = Carbon::now();

$now->copy()->addDay();
$now->copy()->addMonth();
$now->copy()->addYear();
// etc...

复制方法实际上创建了一个新的Carbon对象,然后您可以应用更改而不会影响原始的$now变量。

总之,复制Carbon实例的方法是:

  • copy
  • clone - copy的别名

查看文档:https://carbon.nesbot.com/docs/


11
投票

问题是你假设subDay()/ addDay()不改变日期对象,而他们做....他们只是围绕DateTime对象modify()方法:

DateTime :: modify - date_modify - 更改时间戳

(我的重点)

相反,使用

$navDays = [
    '-7Days' => (clone $date)->subDay('7')->toDateString(),
    '-1Day'  => (clone $date)->subDay('1')->toDateString(),
    'Today'  => (clone $date)->today()->toDateString(),
    '+1Day'  => (clone $date)->addDay('1')->toDateString(),
    '+7Days' => (clone $date)->addDay('7')->toDateString()
];

0
投票

Doco

您还可以创建现有Carbon实例的副本()。正如预期的那样,日期,时间和时区值都被复制到新实例。

$dt = Carbon::now();
echo $dt->diffInYears($dt->copy()->addYear());  // 1

// $dt was unchanged and still holds the value of Carbon:now()
© www.soinside.com 2019 - 2024. All rights reserved.