Уменьшение типа null не имеет никакого эффекта, это изменится в следующей основной версии

Этот код работал в предыдущих версиях 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, прежде чем пытаться ее уменьшить? Делали ли вы какие-либо попытки внести изменения самостоятельно?

M. Eriksson 01.05.2024 13:29

Как ясно сказано в сообщении, вы вызываете функцию со значением null для параметра $year, чего не должно происходить.

Olivier 01.05.2024 13:29

Есть ли в предупреждающем сообщении что-то особенное, что вам сложно понять? Если да, то вам следует упомянуть об этом, чтобы мы могли вам в этом помочь. Вы проводили какое-нибудь исследование? См. также Как спросить

ADyson 01.05.2024 13:32

Вам нужно добавить код, чтобы проверить, является ли год нулевым (и для любого другого, если все они являются обязательными полями), а затем либо заменить значение по умолчанию (если применимо), либо, возможно, выдать ошибку - выбор, очевидно, за вами, но что-то делать обязательно нужно, потому что пытаться вычесть из null вообще не имеет смысла... отсюда и предупреждение. Раньше PHP был более терпим к такого рода ерунде, и вам приходилось жить со своими ошибками, если вы их не замечали, но теперь он пытается заставить людей писать лучший код.

ADyson 01.05.2024 14:42

Я отредактировал, чтобы прояснить вопрос, но по-прежнему не хватает подробностей о том, как вызывался код, вызывающий эту ошибку. Это следует добавить как редактирование к вопросу, чтобы оно могло лучше помочь будущим посетителям.

miken32 30.05.2024 19:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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;
    }
}

«Чтобы исправить свой код, просто добавьте проверку на ноль». Было бы лучше знать, почему функция вызывается с нулевым значением, и исправить вызывающую сторону. Правильное значение может быть в следующем году, а не в текущем, мы не знаем.

Olivier 01.05.2024 14:51

@Оливье Я склонен согласиться, но нам дали только код функции, и это может быть не так просто исправить в восходящем направлении (т. е. запрос может возвращать ноль, и может быть непросто найти все запросы, которые это делают ). Некоторые обновленные соглашения PHP вынудили меня внести локальные изменения таким образом.

Machavity 01.05.2024 14:54

Конечно, но если ОП (который, очевидно, имеет низкие навыки PHP) прочитает ваш ответ, он просто скопирует/вставит код и поверит, что проблема теперь устранена. Я написал комментарий, чтобы они знали, что это может быть не так просто.

Olivier 01.05.2024 14:58

Теперь я знаю, что null-- по-прежнему равно нулю. Поскольку код отработал 20 лет, то и подразумевается нулевое значение, по крайней мере ваш фикс нарушает замысел.

shingo 01.05.2024 16:43

@shingo Я не понимаю, что ты имеешь в виду. Нам не показано, что он делает с $year, поэтому предположение о том, что оно равно нулю, может быть не тем, что оно должно делать.

Machavity 01.05.2024 17:01

Нас не показывают. Но я предпочитаю исходить из того, что $year имеет значение null (возможно, как неиспользуемый аргумент), иначе весь код должен содержать больше предупреждений и ошибок, вызванных значением null. Вы заменили его на текущий год, думаю, это скорее даст неожиданный результат.

shingo 01.05.2024 17:17
$year ??= date('Y'); будет работать вместо if ($year === null) $year = date('Y'); (меня пугают условные обозначения без фигурных скобок)
miken32 30.05.2024 19:19

Другие вопросы по теме