PHP:如何按值传递日期对象?

时间:2015-04-13 04:30:36

标签: php

根据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)
}

那么,如何通过值将日期对象传递给函数,以便不更改原始对象?

2 个答案:

答案 0 :(得分:3)

变量按值传递。如果分配给参数变量,则不会修改原始变量。例如:

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

答案 1 :(得分:1)

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

选中此http://php.net/manual/en/language.oop5.references.php

相关问题