为什么不能用它的表达式替换日期变量何时运行日期操作?



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

php > echo $d = date('Y-m-d');
2019-07-26
php > echo date("Y-m-d",strtotime("$d -1 day"));
2019-07-25

使用上面的php代码,日期2019-07-26减去1天=2019-07-25
为什么不能将两个命令合并为一个,例如下面的php代码?

php > echo date("Y-m-d",strtotime("date('Y-m-d')  -1 day"));
1970-01-01

为什么不能用它的表达式date('Y-m-d')替换日期变量$d

这是一个字符串"date('Y-m-d') -1 day"- 出于明显的安全原因,字符串中包含的函数不会自动执行... (你可以用eval但这是另一天的另一个话题)。 否则,如果他们这样做,您可以非常轻松地劫持服务器,实际上许多漏洞利用使用诸如eval()或 Regex 的e修饰符之类的东西(由于这个原因,现在从 PHP7 开始被删除)通过 PHP 执行字符串中包含的任意代码。

因此,只要问问自己自 1970 年以来文字字符串的时间是多少秒"date('Y-m-d') -1 day"如果你回答我不知道,那么 PHP 也不知道。

就个人而言,我会为此放弃程序功能并这样做:

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

输出

2019-07-24

沙盒

如果你真的想使用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 中看起来更好),您可以将其与属性等一起使用。 像这样:echo "foo {$this->name}",没有括号就不起作用。对象的方法也可以使用括号,例如$D=new DateTime; echo "today is {$D->format('Y-m-d')}"

现在,不幸的是,日期函数不是变量,因此插值不适用于它(由于我上面提到的原因):

"date('Y-m-d')  -1 day"

所以你在第一个例子中看到$d最终结果是这样的2019-07-25 -1 day- 这几乎就是我上面所说的...... 前面(你的第二个示例)是上面的代码块中的内容(字面意思)。

干杯!

附言。 我喜欢说"插值",因为它让我听起来很聪明......哈哈。

最新更新