Этот код работал в предыдущих версиях PHP в течение многих лет:
function dayOfWeek ($day, $month, $year)
{
// ...
if ($month < 3) {
$month += 10;
$year--; // **24 line**
}
else {
$month -= 2;
}
// ...
}
Однако после обновления до PHP 8.3 я иногда получаю это предупреждение при вызове:
Предупреждение: Уменьшение типа null не имеет никакого эффекта, это изменится в следующая основная версия PHP в /home/gagebu/www/calendar.php в строке 24.
Как мне отредактировать код, чтобы устранить это предупреждение?
Как ясно сказано в сообщении, вы вызываете функцию со значением null
для параметра $year
, чего не должно происходить.
Есть ли в предупреждающем сообщении что-то особенное, что вам сложно понять? Если да, то вам следует упомянуть об этом, чтобы мы могли вам в этом помочь. Вы проводили какое-нибудь исследование? См. также Как спросить
Вам нужно добавить код, чтобы проверить, является ли год нулевым (и для любого другого, если все они являются обязательными полями), а затем либо заменить значение по умолчанию (если применимо), либо, возможно, выдать ошибку - выбор, очевидно, за вами, но что-то делать обязательно нужно, потому что пытаться вычесть из null
вообще не имеет смысла... отсюда и предупреждение. Раньше PHP был более терпим к такого рода ерунде, и вам приходилось жить со своими ошибками, если вы их не замечали, но теперь он пытается заставить людей писать лучший код.
Я отредактировал, чтобы прояснить вопрос, но по-прежнему не хватает подробностей о том, как вызывался код, вызывающий эту ошибку. Это следует добавить как редактирование к вопросу, чтобы оно могло лучше помочь будущим посетителям.
PHP уже давно пытается навести порядок, вызванный присущей ему слабой типизацией, и это не исключение. Это было изменено в этом RFC, в котором отмечается, что при попытке увеличения или уменьшения null
происходит нечто неожиданное.
$x = $y = null;
$x++;
var_dump($x); // 1
$y--;
var_dump($y); // NULL
Это непоследовательное поведение. Вместо этого PHP будет ожидать, что вы в будущем будете передавать что-то числовое.
Чтобы исправить код, просто добавьте галочку для null
. Я добавил текущий год, но вы можете добавить свое значение по умолчанию.
function dayOfWeek ($day, $month, $year)
{
if ($year === null) $year = date('Y');
if ($month < 3) {
$month += 10;
$year--; // **24 line**
}
else {
$month -= 2;
}
}
«Чтобы исправить свой код, просто добавьте проверку на ноль». Было бы лучше знать, почему функция вызывается с нулевым значением, и исправить вызывающую сторону. Правильное значение может быть в следующем году, а не в текущем, мы не знаем.
@Оливье Я склонен согласиться, но нам дали только код функции, и это может быть не так просто исправить в восходящем направлении (т. е. запрос может возвращать ноль, и может быть непросто найти все запросы, которые это делают ). Некоторые обновленные соглашения PHP вынудили меня внести локальные изменения таким образом.
Конечно, но если ОП (который, очевидно, имеет низкие навыки PHP) прочитает ваш ответ, он просто скопирует/вставит код и поверит, что проблема теперь устранена. Я написал комментарий, чтобы они знали, что это может быть не так просто.
Теперь я знаю, что null--
по-прежнему равно нулю. Поскольку код отработал 20 лет, то и подразумевается нулевое значение, по крайней мере ваш фикс нарушает замысел.
@shingo Я не понимаю, что ты имеешь в виду. Нам не показано, что он делает с $year
, поэтому предположение о том, что оно равно нулю, может быть не тем, что оно должно делать.
Нас не показывают. Но я предпочитаю исходить из того, что $year имеет значение null (возможно, как неиспользуемый аргумент), иначе весь код должен содержать больше предупреждений и ошибок, вызванных значением null. Вы заменили его на текущий год, думаю, это скорее даст неожиданный результат.
$year ??= date('Y');
будет работать вместо if ($year === null) $year = date('Y');
(меня пугают условные обозначения без фигурных скобок)
Пробовали ли вы проверить, имеет ли переменная значение null, прежде чем пытаться ее уменьшить? Делали ли вы какие-либо попытки внести изменения самостоятельно?