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-&gt;toImmutable()-&gt;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 类改变了我原来的变量值的主要内容,如果未能解决你的问题,请参考以下文章

“切换”和“如果”条件没有检查我在 PHP 上的变量值 [重复]

C#如何将新变量的基类中的变量值更改为派生类

根据附加的变量值,绑定类似乎无法正常工作

关于php读取js的变量值问题

怎么在debug时显示全部的变量值

C#如何使用接口清除其他类的变量值?