【问题标题】:PHP: How do I pass date objects by value?PHP:如何按值传递日期对象?
【发布时间】:2015-04-13 04:30:35
【问题描述】:

根据http://php.net/manual/en/functions.arguments.php

默认情况下,函数参数是按值传递的(因此,如果函数内的参数值发生变化,函数外不会发生变化)。

但是,当我尝试以下脚本时,参数是通过引用传递的。

function test($change_date) {
    $change_date->add(new DateInterval('P1D'));
}

$date_initial = new DateTime();
$date_initial->sub(new DateInterval('P30D'));
var_dump($date_initial);
test($date_initial);
var_dump($date_initial);

返回:

object(DateTime)#3 (3) {
  ["date"]=>string(19) "2015-03-14 11:19:23"
  ["timezone_type"]=>int()
  ["timezone"]=>string(12)
}
object(DateTime)#3 (3) {
  ["date"]=>string(19) "2015-03-15 11:19:23"
  ["timezone_type"]=>int()
  ["timezone"]=>string(12)
}

那么,如何将日期对象按值传递给函数,从而不改变原始对象呢?

【问题讨论】:

    标签: php


    【解决方案1】:

    变量是按值传递的。如果您分配给参数变量,它不会修改原始变量。示例:

    function test ($change_date) {
        $change_date = 3;
    }
    $date_initial = new DateTime();
    var_dump($date_initial);
    test($date_initial);
    var_dump($date_initial);
    

    函数中的赋值不影响$date_initial的值。

    但是,您的 test 函数不会分配给变量,它会修改对象。对象永远不会自动复制,因此所有包含对象的变量都将包含修改后的对象。如果你想复制一个对象,你必须明确地克隆它:

    function test($change_date) {
        $change_date = clone $change_date;
        $change_date->add(new DateInterval('P1D'));
    }
    

    DEMO

    【讨论】:

    • 他说他不想修改原始对象。
    • 我知道。我正在修改一个克隆。
    【解决方案2】:

    您不能将对象作为按值调用传递。要么您必须在函数内实例化另一个对象,要么您必须克隆现有对象。

    查看http://php.net/manual/en/language.oop5.references.php

    【讨论】:

      猜你喜欢
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2018-07-20
      相关资源
      最近更新 更多