在PHP 8中,同时包含.'和'+'/'-'的无括号表达式的行为将发生变化:“+”/“-”将具有更高的优先级

mm9b1k5b  于 2023-03-22  发布在  PHP
关注(0)|答案(3)|浏览(230)
$date1 = date('d M Y', strtotime('+' . $i + 1 . 'month'));

这个错误弹出有时甚至我没有调用这个函数在这一点上,但它的工作正常,当我刷新页面,这似乎是一些警告。

avwztpqn

avwztpqn1#

问题是你的表情

'+' . $i + 1 . 'month'

首先,它计算最左边的操作数,即'+'。然后,它将$i附加到String上,结果类似于' +123'。然后,它试图将1数字地添加到String上,但这将失败,因为PHP无法将左侧转换为数字。为了解决这个问题,您需要先评估$i + 1,然后再评估您的String
您可以隐式地执行此操作:

$date1 = date('d M Y', strtotime('+' . ($i + 1) . 'month'));

或者明确地说:

$monthOffset = $i + 1;
$date1 = date('d M Y', strtotime('+' . $monthOffset . 'month'));
yzckvree

yzckvree2#

看起来你使用的是PHP7.4,它会把某些东西标记为deprecated。这些不是错误。在适当的地方手动添加括号。
示例:

$response = '1234567890';
$header = 'Content-length: ' . strlen($response) + 1;
header($header);

在PHP 5.6中,$header将包含1。在PHP 7.0到7.4中,它将包含相同的内容,但也会发出弃用警告。在PHP 8.0+中,它将包含Content-length:11.
我们将算术表达式 Package 在括号中,以便获得正确的数字:

$response = '1234567890';
header('Content-length: ' . (strlen($response) + 1));

所以,你可以隐式地这样做:

$date1 = date('d M Y', strtotime('+' . ($i + 1) . 'month'));
bq8i3lrv

bq8i3lrv3#

PHP抱怨是因为在PHP8之前,你写的东西并不意味着你认为它做的事情。(还因为在大多数情况下,代码会表现得不正确,尽管在你的例子中它工作得很好。)
在PHP 8中,它 * 确实 * 表示您认为它所做的事情,但您也可以添加括号以使其更清楚。

$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'));

但是,您可以看到您的代码工作得很好,因为strtotime(至少在PHP 7.4中)不关心它是否看到'+2month'(如预期的那样)或'2month'。strtotime的结果将是相同的,因此$date1也将是相同的。
弃用警告并不真正适用于你,因为当这些运算符的优先级发生变化时,总体结果不会改变。但是为了消除警告(和任何混淆),你总是可以通过添加括号来改变它,就像其他答案所建议的那样。

相关问题