php - DateTimeImmutable 与 DateTime
问题描述
这2个类DateTime
并DateTimeImmutable
实现了相同的接口DateTimeInterface
。因此我想知道:
这两个类DateTime
和有什么区别DateTimeImmutable
?
解决方案
该类的文档中描述了差异的核心DateTime
:
此类的行为与 DateTimeImmutable 相同,只是在调用 DateTime::modify() 等修改方法时对象自身会被修改。
让我们通过一个具体的例子来观察这种差异:
$date = new DateTime();
$tomorrow = $date->modify('+1 day');
echo $date->format('Y-m-d');
echo $tomorrow->format('Y-m-d');
这将输出:
2021-05-15
2021-05-15
这里发生的是modify
返回对象的相同实例DateTime
。该变量$tomorrow
不包含不同的对象,它包含对原始对象的引用。更新新变量也修改了原始变量。
如果我们执行相同的修改,但在不可变版本上:
$date = new DateTimeImmutable();
$tomorrow = $date->modify('+1 day');
echo $date->format('Y-m-d');
echo $tomorrow->format('Y-m-d');
这将输出:
2021-05-14
2021-05-15
因为在 中DateTimeImmutable
,修改方法不会返回相同的实例,它们会为您提供一个新实例(也是不可变的)。这也意味着您必须将其结果分配给不可变版本的变量(如前面的示例)才能使用它:
$date = new DateTime('2021-05-14');
$date->modify('+1 day');
echo $date->format('Y-m-d'); // 2021-05-15
$date = new DateTimeImmutable('2021-05-14');
$date->modify('+1 day');
echo $date->format('Y-m-d'); // 2021-05-14; original is untouched
由于这种行为,不可变版本几乎总是比可变版本更受欢迎。不小心修改了您不想修改的日期实例是一个非常常见的错误。
在可以可靠地确定不存在损害应用程序状态的危险的情况下,您可能更喜欢可变版本以避免分配步骤,但最好在您牢牢掌握概念后进行估计。
除了modify
,以下方法也被认为是变异的:
add
sub
setDate
setISODate
setTime
setTimezone
推荐阅读
- arrays - 如何将数组加载到图表中?
- python - re.search 搜索字符串的最后一部分
- python - Python Regex Negative Lookbehind Match 没有固定宽度
- php - 如何阻止我的 PHP 页面在不应该重定向时重定向?
- python - 如何获取在python中打印结果的函数
- javascript - Typescript 的自定义 Promise 类不起作用
- php - 在事务中使用 PHP PDO 获取存储过程 OUT 参数的值
- api - Microsoft Graph API 搜索 Planner 计划
- c# - 格式化@Html.EditorFor
- php - PHP将2个数组变量合并为1个