#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
}
Однако вам, вероятно, лучше просто удалить код, который полагался на него, и найти более перспективное решение.