PHP Carbon 类改变了我原来的变量值
Posted
技术标签:
【中文标题】PHP Carbon 类改变了我原来的变量值【英文标题】:PHP Carbon class changing my original variable value 【发布时间】:2016-03-28 14:26:21 【问题描述】:我正在尝试在我正在创建的日历类型的东西中制作一些导航按钮,并且我正在使用碳来创建日期。
这是控制器中的代码:
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>
有人知道我做错了什么吗?
【问题讨论】:
【参考方案1】:问题是您假设 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()
];
【讨论】:
这给了我一个错误:语法错误,意外 '->' (T_OBJECT_OPERATOR),期待 ']' 我需要事先设置这些,然后将它们添加到数组中吗? 对不起,我意识到我在我的 php7 环境中测试过,但认为它不适用于 PHP5 carbon 也有一个复制方法,所以你可以做类似.. $date->copy()->subDay('7')->toDateString() php.net/manual/en/class.datetime.php 与 php.net/manual/en/class.datetimeimmutable.php。碳是基于第一个【参考方案2】:当您对 Carbon 对象运行这些方法时,它会更新对象本身。因此addDay()
将 Carbon 的值向前移动了一天。
这是你需要做的:
$now = Carbon::now();
$now->copy()->addDay();
$now->copy()->addMonth();
$now->copy()->addYear();
// etc...
copy 方法本质上是创建一个新的 Carbon 对象,然后您可以将更改应用到该对象,而不会影响原始的 $now
变量。
总结一下,复制一个Carbon实例的方法有:
copy
clone
- copy
的别名
查看文档:https://carbon.nesbot.com/docs/
【讨论】:
从 Laravel +5.8 开始,你也可以使用$now->toImmutable()->addDay()
。【参考方案3】:
Doco 说
您还可以创建现有 Carbon 实例的 copy()。正如预期的那样,日期、时间和时区值都被复制到新实例中。
$dt = Carbon::now();
echo $dt->diffInYears($dt->copy()->addYear()); // 1
// $dt was unchanged and still holds the value of Carbon:now()
【讨论】:
以上是关于PHP Carbon 类改变了我原来的变量值的主要内容,如果未能解决你的问题,请参考以下文章