【问题标题】:When I add an interval to a datetime, PHP seems to alter other datetime variables. Why? [duplicate]当我向日期时间添加间隔时,PHP 似乎会更改其他日期时间变量。为什么? [复制]
【发布时间】:2018-08-10 19:15:18
【问题描述】:

我真的不知道怎么问这个。

我在两个变量中保存了相同的日期。 然后我将 100 天添加到第二个变量。 但两者似乎都发生了变化。为什么会这样?

$begin = new DateTime("20180101");
$end = $begin;
$end = $end->add(new DateInterval('P100D'));

echo $begin->format('Y-m-d') . "<br>";
echo $end->format('Y-m-d');

结果是:

2018-04-11

2018-04-11

但我期待:

2018-01-01

2018-04-11

【问题讨论】:

  • add() 修改对象。它返回自身以用于链接目的,但您不是“获得新日期”,而是获得相同的日期对象,无论您指定的时间间隔有多长。
  • 奇怪的是,当您创建$end 时,它实际上是指向$begin 的指针。您需要克隆该对象。不过,我无法解释为什么它会这样工作。
  • @aynber 为什么“奇怪”?这就是变量赋值的工作原理。
  • 您实际上不需要更进一步@aynber,这与例如:stdClass 的行为完全相同。如果您从它创建一个对象,设置一个属性,使用它等于另一个变量,然后更改此属性,它将完全一样。
  • 我...实际上不同意这是一个重复的问题。他从未问过如何深度复制 DateTime 对象,他只是问为什么日期保持不变,即使在引用的主题中回答了这个问题,也不是他问的。

标签: php datetime datetime-format


【解决方案1】:

如果你想使用同一个 DateTime 对象有不同的日子,你必须这样做:

$begin = new DateTime("20180101");
$end = clone $begin;
$end = $end->add(new DateInterval('P100D'));

echo $begin->format('Y-m-d') . "<br>";
echo $end->format('Y-m-d');

为什么:PHP 通过引用使用相同的对象... 如果您通过 new DateTime('pattern') 创建两个不同的对象 DateTime,它将表现得非常好。

您现在看到的行为也可以这样观察:

$test = new stdClass();
$test->sample = "What!?";

$another = $test;
$another->sample = "Impossibru!";

echo $another->sample . "<br>";
echo $test->sample . "<br>";

【讨论】:

  • 使用DateTimeImmutable代替克隆DateTime。
  • DateTimeImmutable 是一个非常具体的解决方案,只能在这种对象中使用,因为克隆适用于每个对象......
  • 这是一个非常具体的问题,有一个特定的最佳解决方案:)
  • 好吧。如果我能给出一个适用于这个和任何其他对象的解决方案。为什么我应该只为这个对象指定一个解决方案?
猜你喜欢
  • 2017-09-25
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 2019-08-10
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多