Обязательный параметр $xxx следует за необязательным параметром $yyy

Deprecated: Required parameter $xxx follows optional parameter $yyy in...

После обновления до PHP 8.0 эта ошибка возникает при запуске такого кода:

function test_function(int $var1 = 2, int $var2) {
    return $var1 / $var2;
}

Это работало в прошлых версиях PHP без проблем.

Измените порядок параметров, поместив $xxx перед необязательным параметром $yyy.

Darren Murphy 27.04.2021 14:06

На вопрос уже есть ответ. Выполнение того, что вы предлагаете, будет означать переписывание каждого использования вашей функции в вашей кодовой базе.

miken32 27.04.2021 15:30
Стоит ли изучать 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 и хотите разрабатывать...
37
2
65 677
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Этот стиль объявления функции устарел в PHP 8.0 . Написание подобных функций никогда не имело смысла , поскольку все параметры (вплоть до последнего необходимого) нужно было указывать при вызове функции. Это также вызвало путаницу с использованием класса ReflectionFunctionAbstract для анализа функций и методов.

Новое устаревание просто гарантирует, что сигнатуры функций следуют допущению здравого смысла о том, что обязательные параметры, которые должны появиться, всегда должны быть объявлены перед необязательными.

Функцию следует переписать, чтобы удалить значение по умолчанию для более ранних параметров. Поскольку функция никогда не может быть вызвана без объявления всех параметров, это не должно влиять на ее функциональность.

function test_function(int $var1, int $var2) {
    return $var1 / $var2;
}

"поскольку все параметры (вплоть до последнего необходимого) нужно было бы указывать при вызове функции" . Не согласен 3v4l.org/Nb6i6 ;)

Rain 14.12.2020 23:43

Очень впечатляющие придирки! 👍🏼

miken32 14.12.2020 23:46

"Написание подобных функций никогда не имело смысла" - я не согласен. Часто бывают случаи, когда аргументы могут быть упорядочены по-разному из соображений здравомыслия или удобства чтения. Это устаревание кажется ненужным и раздражающим изменением.

Enverex 08.04.2021 15:14

@Enverex значение по умолчанию, указанное в таком случае, никогда не может быть использовано, поэтому оно бесполезно. Я профессионально программирую на PHP более 15 лет, и мне никогда не приходилось этим заниматься. Порядок аргументов и значения по умолчанию не предназначены для использования в качестве документации, для этого предназначен PHPDoc.

miken32 08.04.2021 18:17

«значение по умолчанию, указанное в таком случае, никогда не может быть использовано». Да, возможно, вы передаете null для значений, которые хотите использовать по умолчанию. Кроме того, я не говорю здесь о документации, просто о более дружелюбном порядке аргументов.

Enverex 09.04.2021 12:41

@Enverex Если вы пройдете null, вы получите null для параметра, а не значение по умолчанию. 3v4l.org/MGWIR

miken32 09.04.2021 17:20

@Rain, какую функцию php8 использует ваш пример? Предполагая, что это должна быть новая функция php8, поскольку в предыдущих версиях это была синтаксическая ошибка.

chiliNUT 11.05.2021 09:38

@chiliNUT Именованные аргументы.

Rain 11.05.2021 10:42

@ Дождь - я тоже не согласен. Мои 2 цента... Это устаревание PHP8 вообще не было хорошо продумано. В PHP8 они добавили именованные параметры, что означает, что теперь вы можете вызывать параметры в любом порядке, если вы называете их по имени, например: func(param1: "value1", param2: "value2") Таким образом, этот синтаксис дополняет возможность указывать значения по умолчанию для любого параметра в любом порядке. @ miken32 - Вы сказали, что «поскольку все параметры (вплоть до последнего требуемого) необходимо указать при вызове функции» - это уже не так.

Ray Perea 19.07.2021 05:52

Обязательный параметр без значения по умолчанию должен стоять первым.

function test_function(int $xxx, int $yyy = 2)
{
    return $xxx * $yyy;
}
 

А затем обновлять каждое использование этого метода в вашем коде?

miken32 15.04.2021 19:03

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

Alemoh Rapheal Baja 16.04.2021 12:23

параметр, который требуется без значения по умолчанию, должен стоять первым

Alemoh Rapheal Baja 17.06.2021 13:14

«Если за параметром со значением по умолчанию следует обязательный параметр, значение по умолчанию не действует».

Это устарело с PHP 8.0.0 и обычно может быть решено

  1. отбрасывая значение по умолчанию
  2. изменив положение параметров, как было предложено выше

, без изменения функционала.

В моем случае этот метод сработал =)

Я столкнулся со следующей ошибкой:

ErrorException Обязательный параметр $id следует за необязательным параметром $getLink

Следующий код генерировал это исключение

public function fo($getLink = null , $id)
{ ......
}

Чтобы устранить эту ошибку, я изменил положение параметров, как это предлагается в следующем коде:

 public function fo($id, getLink = null)
    { ......
    }

Готово =)

В каждом месте, где вы используете этот метод, вам нужно будет изменить свой код. Почему вы сделали бы это вместо того, чтобы просто установить значение по умолчанию для второго параметра?

miken32 20.02.2022 18:23

@ miken32 «Если за параметром со значением по умолчанию следует обязательный параметр, значение по умолчанию не действует». Это устарело с PHP 8.0.0 и обычно может быть решено путем удаления значения по умолчанию или изменения положения параметров, как было предложено выше, без изменения функциональности.

Omkar Ghurye 23.02.2022 13:01

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

miken32 23.02.2022 15:02

решение, которое отлично сработало для меня, заключалось в том, чтобы поменять местами параметры, гарантируя, что ни один параметр не будет следовать за любым параметром со значением по умолчанию, равным нулю.

Если кто-то пытается найти способ определить функции, которые нуждаются в обновлении, вы можете использовать это регулярное выражение в Linux через grep, которое выведет результаты в файл с именем results.txt. Он будет искать только внутри файлов .php.

Мне потребовалось некоторое время, чтобы заставить его работать, и, вероятно, он нуждается в дополнительной настройке!

flag -i = Case insensitive search
flag -n = print line number match was found on with the file found
flag -r = recursive from current location downwards
flag -E = Use extended regular expression rules


grep -irnE --include \*.php 'function ([a-zA-Z0-9_]*?)[ ]?\(.*?\$[a-zA-Z0-9_]*?=.*?(\$[a-zA-Z0-9_]*?)[\),]{1}[^\{]*?' > results.txt

Надеюсь, это поможет любому, кто пытается найти и исправить ошибки.

Почти уверен, что ERE не поддерживает ленивые совпадения, поэтому все *? избыточны. И в нескольких местах вместо этого должен быть +. Но на самом деле лучшим инструментом для этого будет IDE. Он будет ловить такие вещи, как многострочные подписи, которые grep не может.

miken32 16.03.2023 14:50

Вероятно, вы могли бы также использовать для этого встроенный в PHP анализатор токенов, хотя это не будет коротким решением!

miken32 16.03.2023 14:52

@ miken32 - Протестировал его в Linux с помощью тестовых сценариев и сопоставил все, что смог придумать в виде комбинаций. Пожалуйста, проверьте это самостоятельно и подтвердите, поскольку угадывать не рекомендуется. Возможно, это разные вкусы, не знаю. Я просто знаю, что вышеприведенное нашло то, что мне было нужно, но я очень рад обновить его, если нужно, так что это на 100% идеально! - проверю анализатор токенов, спасибо.

Watts Epherson 16.03.2023 14:55

Я не говорю, что это не сработает, просто а) .*? точно такое же, как .* в ERE и б) ваше регулярное выражение допускает пустые/недопустимые аргументы с такими вещами, как \$[a-zA-Z0-9_]*. Кроме того: квантификатор {1} является избыточным, а поиск без учета регистра означает, что не нужно проверять как a-z, так и A-Z.

miken32 16.03.2023 19:15

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