【问题标题】:Date variables being assigned with 'reference' improperly?日期变量被不正确地分配了“参考”?
【发布时间】:2014-11-15 07:43:42
【问题描述】:

我正在经历一些对我来说很奇怪的事情,希望得到第二个意见。

似乎我的日期变量在分配期间应用了“引用”,而它们不应该这样做。

例子:

$date1 = date_create('2014-09-20');

$date2 = $date1;

date_add($date2,date_interval_create_from_date_string("1 month"));

// I would expect this to print "2014-09-20". However it is printing "2014-10-20"
echo date_format($date1,'Y-m-d') . "<br>";

//I would expect this to print "2014-10-20". It does so.
echo date_format($date2,'Y-m-d') . "<br>";

基本上,每当我更改 $date2 时,它也会更改存储在 $date1 中的值。

我疯了吗?这是正确的行为吗?我的编译器有问题吗? php.ini 中有什么?我只是不明白一些非常简单的 PHP 语法概念吗?

我在 IIS 7.5.7600、Windows 7 上使用 PHP 5.3.28。通过 Firefox 32 或任何提升当前版本的工具访问页面# 他们现在已经达到...

我已经尝试过使用“New Datetime”/Add(New DateInterval) 方法和上面示例中的 date_create/date_add 方法。尝试先创建变量,然后分配它们。结果相同。尝试在作业中添加“&”只是为了看看会发生什么。结果一样。

我对相同的模式和使用整数没有任何问题:

$int1 = 1;

$int2 = $int1;

$int2 = $int2 + 1;

echo "$int1 <br>"; //prints 1

echo "$int2 <br>"; //prints 2

它表现得好像在日期变量上有引用/指针,即使没有指定。

感谢您的帮助..

【问题讨论】:

    标签: php date pointers reference variable-assignment


    【解决方案1】:

    不,你不是疯了,这将是行为,如果你想要一个单独的对象使其不会反射,请改用clone

    $date1 = date_create('2014-09-20');
    $date2 = clone $date1; // clone $date1 object
    
    date_add($date2,date_interval_create_from_date_string("1 month"));
    echo date_format($date1,'Y-m-d') . "<br>"; // 2014-09-20
    
    
    echo date_format($date2,'Y-m-d') . "<br>"; // 2014-10-20
    

    【讨论】:

      【解决方案2】:

      它们确实引用了同一个对象。以下代码可以使用 debug_zval_dump 为您提供一些见解:

      <?php
      $date1 = date_create('2014-09-20');
      $date2 = $date1;
      $date3 = date_create('2014-09-20');
      echo debug_zval_dump($date1, $date2, $date3);
      ?>
      

      【讨论】:

      • 谢谢。你知道我该怎么做:1)创建一个日期对象 2)创建第二个独立的日期对象并将其分配给来自日期对象#1的值 3)独立更改日期对象#2,使得日期中的值对象#1 保持不变?如果我不希望它们是同一个对象怎么办?
      • 在这种情况下,您可以: $date2 = clone $date1;
      【解决方案3】:

      感谢两位的回答。

      我想补充一点,现在用你的答案做更多的阅读:

      之所以如此,是因为 DateTime 不是本机数据类型,它是一个类。所以当我们处理一个日期变量时,我们实际上是在处理一个类的实例。这种指向对象的指针分配,而不是对象的副本,是 PHP 中所有类对象的行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-30
        • 1970-01-01
        • 2023-02-08
        • 1970-01-01
        • 2021-05-25
        • 1970-01-01
        • 1970-01-01
        • 2021-07-24
        相关资源
        最近更新 更多