Deprecated: Required parameter $xxx follows optional parameter $yyy in...
После обновления до PHP 8.0 эта ошибка возникает при запуске такого кода:
function test_function(int $var1 = 2, int $var2) {
return $var1 / $var2;
}
Это работало в прошлых версиях PHP без проблем.
На вопрос уже есть ответ. Выполнение того, что вы предлагаете, будет означать переписывание каждого использования вашей функции в вашей кодовой базе.
Этот стиль объявления функции устарел в PHP 8.0 . Написание подобных функций никогда не имело смысла , поскольку все параметры (вплоть до последнего необходимого) нужно было указывать при вызове функции. Это также вызвало путаницу с использованием класса ReflectionFunctionAbstract для анализа функций и методов.
Новое устаревание просто гарантирует, что сигнатуры функций следуют допущению здравого смысла о том, что обязательные параметры, которые должны появиться, всегда должны быть объявлены перед необязательными.
Функцию следует переписать, чтобы удалить значение по умолчанию для более ранних параметров. Поскольку функция никогда не может быть вызвана без объявления всех параметров, это не должно влиять на ее функциональность.
function test_function(int $var1, int $var2) {
return $var1 / $var2;
}
"поскольку все параметры (вплоть до последнего необходимого) нужно было бы указывать при вызове функции" . Не согласен 3v4l.org/Nb6i6 ;)
Очень впечатляющие придирки! 👍🏼
"Написание подобных функций никогда не имело смысла" - я не согласен. Часто бывают случаи, когда аргументы могут быть упорядочены по-разному из соображений здравомыслия или удобства чтения. Это устаревание кажется ненужным и раздражающим изменением.
@Enverex значение по умолчанию, указанное в таком случае, никогда не может быть использовано, поэтому оно бесполезно. Я профессионально программирую на PHP более 15 лет, и мне никогда не приходилось этим заниматься. Порядок аргументов и значения по умолчанию не предназначены для использования в качестве документации, для этого предназначен PHPDoc.
«значение по умолчанию, указанное в таком случае, никогда не может быть использовано». Да, возможно, вы передаете null для значений, которые хотите использовать по умолчанию. Кроме того, я не говорю здесь о документации, просто о более дружелюбном порядке аргументов.
@Enverex Если вы пройдете null
, вы получите null
для параметра, а не значение по умолчанию. 3v4l.org/MGWIR
@Rain, какую функцию php8 использует ваш пример? Предполагая, что это должна быть новая функция php8, поскольку в предыдущих версиях это была синтаксическая ошибка.
@chiliNUT Именованные аргументы.
@ Дождь - я тоже не согласен. Мои 2 цента... Это устаревание PHP8 вообще не было хорошо продумано. В PHP8 они добавили именованные параметры, что означает, что теперь вы можете вызывать параметры в любом порядке, если вы называете их по имени, например: func(param1: "value1", param2: "value2")
Таким образом, этот синтаксис дополняет возможность указывать значения по умолчанию для любого параметра в любом порядке. @ miken32 - Вы сказали, что «поскольку все параметры (вплоть до последнего требуемого) необходимо указать при вызове функции» - это уже не так.
Обязательный параметр без значения по умолчанию должен стоять первым.
function test_function(int $xxx, int $yyy = 2)
{
return $xxx * $yyy;
}
А затем обновлять каждое использование этого метода в вашем коде?
Я не думаю, что вам придется это делать, за исключением того, что это выдает ошибку.
параметр, который требуется без значения по умолчанию, должен стоять первым
«Если за параметром со значением по умолчанию следует обязательный параметр, значение по умолчанию не действует».
Это устарело с PHP 8.0.0 и обычно может быть решено
, без изменения функционала.
В моем случае этот метод сработал =)
Я столкнулся со следующей ошибкой:
ErrorException Обязательный параметр $id следует за необязательным параметром $getLink
Следующий код генерировал это исключение
public function fo($getLink = null , $id)
{ ......
}
Чтобы устранить эту ошибку, я изменил положение параметров, как это предлагается в следующем коде:
public function fo($id, getLink = null)
{ ......
}
Готово =)
В каждом месте, где вы используете этот метод, вам нужно будет изменить свой код. Почему вы сделали бы это вместо того, чтобы просто установить значение по умолчанию для второго параметра?
@ miken32 «Если за параметром со значением по умолчанию следует обязательный параметр, значение по умолчанию не действует». Это устарело с PHP 8.0.0 и обычно может быть решено путем удаления значения по умолчанию или изменения положения параметров, как было предложено выше, без изменения функциональности.
Это полностью меняет функцию; теперь вам нужно найти и переписать каждую строку кода, использующую эту функцию. Мой вопрос заключался в том, почему это лучше, чем просто отбросить значение по умолчанию, которое не требует изменений в другом коде? Не говоря уже о том, что этот некачественный подход уже был дан в другом ответе.
решение, которое отлично сработало для меня, заключалось в том, чтобы поменять местами параметры, гарантируя, что ни один параметр не будет следовать за любым параметром со значением по умолчанию, равным нулю.
Если кто-то пытается найти способ определить функции, которые нуждаются в обновлении, вы можете использовать это регулярное выражение в 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 не может.
Вероятно, вы могли бы также использовать для этого встроенный в PHP анализатор токенов, хотя это не будет коротким решением!
@ miken32 - Протестировал его в Linux с помощью тестовых сценариев и сопоставил все, что смог придумать в виде комбинаций. Пожалуйста, проверьте это самостоятельно и подтвердите, поскольку угадывать не рекомендуется. Возможно, это разные вкусы, не знаю. Я просто знаю, что вышеприведенное нашло то, что мне было нужно, но я очень рад обновить его, если нужно, так что это на 100% идеально! - проверю анализатор токенов, спасибо.
Я не говорю, что это не сработает, просто а) .*?
точно такое же, как .*
в ERE и б) ваше регулярное выражение допускает пустые/недопустимые аргументы с такими вещами, как \$[a-zA-Z0-9_]*
. Кроме того: квантификатор {1}
является избыточным, а поиск без учета регистра означает, что не нужно проверять как a-z, так и A-Z.
Измените порядок параметров, поместив $xxx перед необязательным параметром $yyy.