【问题标题】:PHP Seems To Be Assigning By Reference, Not By ValuePHP 似乎是通过引用而不是按值分配
【发布时间】:2016-02-01 14:32:57
【问题描述】:

我正在使用以下代码:

$input = new DateTime(filter_input(INPUT_GET, 'date'));
$input->modify('midnight');

echo $input->format(DateTime::RFC3339) . "\n";

$end = $input;
$end->modify('+3 hours');
echo $input->format(DateTime::RFC3339) . "\n";
echo $end->format(DateTime::RFC3339) . "\n";

输出如下:

2016-02-01T00:00:00-5:00
2016-02-01T03:00:00-5:00
2016-02-01T03:00:00-5:00

第二行的输出不应该和第一行一样吗?

据我了解,通过引用分配变量需要使用 $a = &$b,所以我使用的 ($a = $b) 应该是值。所以在$end 上调用的函数也不应该修改$input,对吗?我错过了什么?

【问题讨论】:

  • 不要将标量变量与对象实例混淆.....实例始终是指针
  • 来自PHP Docs - When assigning an already created instance of a class to a new variable, the new variable will access the same instance as the object that was assigned. This behaviour is the same when passing instances to a function. A copy of an already created object can be made by cloning it.

标签: php variable-assignment


【解决方案1】:

问题是DateTime 是对象,并且对象总是通过引用分配。如果你想通过“值”赋值,你必须使用像$end = clone $input;这样的克隆。

这是 PHP 手册中的相关信息:http://php.net/manual/en/language.oop5.references.php

【讨论】:

  • 这可能也值得一读:stackoverflow.com/questions/16893949/…
  • 好的,不知道,谢谢。作为旁注,你会碰巧知道这是为什么吗?这对我来说似乎违反直觉,特别是考虑到正常变量是按值分配的,除非另有说明。
  • 这是因为对象仅通过对内存的引用来表示,而不是像 Mark Ba​​ker 提到的那样由自己的值表示的标量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
相关资源
最近更新 更多