Слишком мало аргументов для функции exception_error_handler() — PHP8

#php #php-8

#php #php-8

Вопрос:

Как сказано в названии, эта ошибка возникает у меня. Я ищу в Интернете и нахожу, что https://github.com/processwire/processwire-issues/issues/1286#issuecomment-738880424

Исходный код:

 function exception_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
}
 

Я просто изменяю последний параметр и делаю его необязательным вот так:

 function exception_error_handler($errno, $errstr, $errfile, $errline, $errcontext=[]) {
}
 

Кто-нибудь знает, почему этот параметр стал необязательным?

Комментарии:

1. Где вы обновили этот последний параметр?

2. руководство по состоянию на PHP7.2.0 errcontext устарел. Использование этого параметра теперь выдает уведомление E_DEPRECATED. (использование настоятельно не рекомендуется)

3.Кто-нибудь знает, почему этот параметр стал необязательным? php.net/manual/en /…

Ответ №1:

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

Определяемая вами функция представляет собой обратный вызов, который будет вызываться PHP с определенными аргументами, которые описаны в руководстве. (Обратите внимание, что во время запроса на этой странице использовалась другая формулировка; после написания этого ответа я отправил исправление, обновляющее его для PHP 8.0 и, надеюсь, делающее его более понятным).

Согласно документации, более старые версии PHP передают 5 параметров в обратный вызов с получением 5-го параметра:

Массив всех переменных, которые существовали в области видимости, в которой была вызвана ошибка.

Это вызывает много странного поведения и предотвращает определенные оптимизации в движке, поэтому в PHP 7.2 было рекомендовано исключить использование этого параметра. В PHP 8.0 параметр больше не передается, то есть PHP теперь вызывает ваш обратный вызов только с 4 параметрами.

Этот параметр всегда был «необязательным» в том смысле, что его безопасно вообще не указывать в подписи. Такой обратный вызов с 4 параметрами будет принят всеми версиями PHP:

 function my_error_handler($errno, $errstr, $errfile, $errline) {
   // ...
}
 

Правильное решение — полностью удалить этот параметр из вашей функции, если:

  • вы пишете код, который будет выполняться только на PHP 8.0 и выше; или
  • на самом деле вы никогда не используете этот параметр в своей функции

Если реализация действительно полагалась на этот параметр, потребуются другие изменения. Возможно, вы захотите включить параметр со значением по умолчанию (что делает его «необязательным» в другом смысле) и использовать его при передаче в более старых версиях PHP:

 function my_error_handler($errno, $errstr, $errfile, $errline, $errcontext=[]) {
   // $errcontext will be populated on older PHP versions, 
   // but will always be an empty array on PHP 8.0 or above
   // Any functionality using it will become useless in future
}
 

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