为什么在执行日期操作时不能用日期表达式替换日期变量?

时间:2019-07-26 01:29:43

标签: php date

在php命令中计算日期操作。

39680/40171 [============================>.] - ETA: 0s  
Score: 0.1192
Evaluation Accuracy: 97.50%
Prediction Accuracy: 9.03%

使用上述php代码,日期php > echo $d = date('Y-m-d'); 2019-07-26 php > echo date("Y-m-d",strtotime("$d -1 day")); 2019-07-25 减去1天= 2019-07-26
为什么不能将两个命令合并为一个,例如以下php代码?

2019-07-25

为什么不能用表达式php > echo date("Y-m-d",strtotime("date('Y-m-d') -1 day")); 1970-01-01 替换日期变量$d

1 个答案:

答案 0 :(得分:2)

这是一个字符串"date('Y-m-d') -1 day"-出于明显的安全原因,字符串中包含的函数不会自动执行...(您可以使用eval,但这是另一天的话题)。否则,如果您这样做,您可以很容易地劫持服务器,实际上,许多漏洞利用诸如eval()e修饰符之类的Regex脚本(由于这个原因,PHP 7以来已将其删除)来执行。通过PHP包含在字符串中的任意代码。

所以只要问问自己,自1970年以来到字面字符串"date('Y-m-d') -1 day"的秒数是多少,如果您回答我不知道,PHP也不知道。

就个人而言,我将放弃该程序的功能并执行此操作:

echo (new DateTime)->modify('-1 day')->format('Y-m-d'); 

输出

2019-07-24

Sandbox

如果您真的想使用Date函数和过程样式,那么就可以完成

 echo date('Y-m-d', strtotime(date('Y-m-d').' -1 day'));

在这里,我正在将内部.函数调用的输出与字符串date进行串联(' -1 day'),当字符串全部由PHP组合在一起时,它看起来像这样2019-07-25 -1 day 。日期功能可以理解并且可以正常工作。

可能使您(还有另一件事要理解)的是变量插值(双引号中的变量被PHP取代)。

   date("Y-m-d",strtotime("$d -1 day"));  //$d is replaced by value

我喜欢在执行此操作时使用{},它更易于阅读(基本上在我的IDE中看起来更好),并且可以将其与诸如属性之类的东西一起使用,例如:{{1} },没有括号将无法正常工作。对象的方法也可以与方括号一起使用,例如echo "foo {$this->name}"

现在,不幸的是,日期函数不是变量,因此插值不适用于它(出于上述原因):

$D=new DateTime; echo "today is {$D->format('Y-m-d')}"

因此,在第一个示例中,您发现 "date('Y-m-d') -1 day" 的最终结果是类似$d的东西-与我上面的内容差不多……之前(第二个示例)就是上面代码块中的内容(按字面意思)。

干杯!

PS。我喜欢说“插值法”,因为它使我听起来很聪明……大声笑。