这是PHP代码中的DateTime错误吗? 7.0.0

时间:2017-04-15 09:09:06

标签: php datetime

这是个主意:

<?php
    $postESDate = 0;

    $sDate = $postESDate;
    $esDate = $sDate + 25;  


    echo $sDate.' ------- ';
    echo $esDate;
?>
  1. 从1变量开始,创建一个与第一个变量无关的新变量。
  2. 制作第二个var,即第二个var加上25。
  3. 当你回应第二和第三个变量时它们是不同的,对吧?

    修改日期时不一样,请尝试以下代码......

    //fails
    $postESDate = '2017-04-15';
    
    $sDate = new DateTime($postESDate);
    
    $esDate = $sDate->modify('+25 days')->format('l jS F Y');   
    $sDate = $sDate->format('l jS F Y');    
    
    
    echo $sDate.' ------- ';
    echo $esDate;
    
  4. 这个回声的日期相同。问题是它实际上是用+25天更新$ sDate而不是仅仅按照我的要求将输出保存到$ esDate所以因此第二个日期格式现在也是+25天..相同。

    修复是为了制作另一个DateTime变量:

    //works
    
    $postESDate = '2017-04-15';
    
    $sDate = new DateTime($postESDate);
    $esDate = new DateTime($postESDate);
    
    $esDate = $esDate->modify('+25 days')->format('l jS F Y');
    $sDate = $sDate->format('l jS F Y');    
    
    
    echo $sDate.' ------- '
    echo $esDate;
    

    这不应该发生,或者我错过了什么?好吧,至少我有一个解决方法。

2 个答案:

答案 0 :(得分:1)

如果您阅读php.net处的文档,则会发现这是预期的行为。 modify改变你调用的对象modify的时间戳,然后返回它进行方法链接 - 这正是你在那里所做的。

答案 1 :(得分:0)

当涉及对象时,这是常见的行为。 变量的行为就像您提到的那样,每个变量都是它们自己的,是的,但是对象的行为不同。

您可以在此处看到相同的行为,例如:

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

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

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

除非您克隆此对象或创建它的新实例,否则它们将通过引用传递。