$date1 = date('d M Y', strtotime('+' . $i + 1 . 'month'));
// prior to PHP 8, . and + have the same precedence, so this means:
$date1 = date('d M Y', strtotime((('+' . $i) + 1) . 'month'));
// for example, with $i=1:
$date1 = date('d M Y', strtotime(('+1' + 1) . 'month'));
$date1 = date('d M Y', strtotime(2 . 'month'));
$date1 = date('d M Y', strtotime('2month'));
3条答案
按热度按时间avwztpqn1#
问题是你的表情
首先,它计算最左边的操作数,即
'+'
。然后,它将$i
附加到String
上,结果类似于'+123'
。然后,它试图将1
数字地添加到String
上,但这将失败,因为PHP无法将左侧转换为数字。为了解决这个问题,您需要先评估$i + 1
,然后再评估您的String
。您可以隐式地执行此操作:
或者明确地说:
yzckvree2#
看起来你使用的是PHP7.4,它会把某些东西标记为deprecated。这些不是错误。在适当的地方手动添加括号。
示例:
在PHP 5.6中,$header将包含1。在PHP 7.0到7.4中,它将包含相同的内容,但也会发出弃用警告。在PHP 8.0+中,它将包含Content-length:11.
我们将算术表达式 Package 在括号中,以便获得正确的数字:
所以,你可以隐式地这样做:
bq8i3lrv3#
PHP抱怨是因为在PHP8之前,你写的东西并不意味着你认为它做的事情。(还因为在大多数情况下,代码会表现得不正确,尽管在你的例子中它工作得很好。)
在PHP 8中,它 * 确实 * 表示您认为它所做的事情,但您也可以添加括号以使其更清楚。
但是,您可以看到您的代码工作得很好,因为strtotime(至少在PHP 7.4中)不关心它是否看到'+2month'(如预期的那样)或'2month'。strtotime的结果将是相同的,因此
$date1
也将是相同的。弃用警告并不真正适用于你,因为当这些运算符的优先级发生变化时,总体结果不会改变。但是为了消除警告(和任何混淆),你总是可以通过添加括号来改变它,就像其他答案所建议的那样。