Функция date_get_last_errors() в PHP
Узнайте, как использовать функцию date_get_last_errors() в PHP для отладки ошибок и предупреждений при работе с датами.
Устали разбираться с ошибками, связанными с датами, в вашем PHP-коде? Тогда вам повезло. Функция date_get_last_errors() в PHP создана специально для этого.
В этой статье мы подробно рассмотрим, как работает функция date_get_last_errors(), её параметры и то, как использовать её для отладки проблем с датами в PHP-коде.
Что такое функция date_get_last_errors()?
Функция date_get_last_errors() — это встроенная функция PHP (доступна начиная с PHP 5.2.0), которая позволяет получить информацию о последней ошибке или предупреждении, связанном с датой. Она возвращает ассоциативный array, содержащий warning_count, warnings, error_count и errors — конкретные коды и текстовые описания того, что пошло не так во время последней операции с датой и временем.
Как использовать date_get_last_errors()
Чтобы использовать функцию date_get_last_errors(), вызывайте её после того, как функция создания или изменения даты завершилась неудачей. В продакшн-коде всегда следует проверять, что функция даты вернула false, прежде чем получать подробности об ошибке. Вот пример:
В этом примере мы пытаемся создать объект даты из строки '2022-13-01', которая является недопустимым значением даты (месяц 13 не существует). Убедившись, что date_create_from_format() вернула false, мы вызываем date_get_last_errors() и выводим возвращённый array с помощью print_r().
Вывод этого кода будет следующим:
Array
(
[warning_count] => 1
[warnings] => Array
(
[10] => The parsed date was invalid
)
[error_count] => 0
[errors] => Array
(
)
)Как видите, возвращённый array разделяет предупреждения и ошибки:
- Ошибки означают, что входные данные не удалось разобрать вовсе (например, посторонний символ или формат, не совпадающий со строкой).
- Предупреждения означают, что строка была разобрана, но результат вызывает сомнения — например, компонент вышел за допустимые пределы. Месяц
13не существует, поэтому PHP переносит или отклоняет его и выдаёт предупреждение[10] => The parsed date was invalid.
Важно: возвращаемое значение при отсутствии ошибок
Распространённая ловушка состоит в том, что возвращаемое значение изменилось в разных версиях PHP:
- PHP 5.2 – 8.1: всегда возвращает ассоциативный array, где
warning_countиerror_countравны0, если всё прошло нормально. - PHP 8.2 и выше: возвращает
false(boolean), если предыдущая операция с датой не породила ни предупреждений, ни ошибок.
Именно поэтому следует ветвить логику на основе результата самой функции даты, а не date_get_last_errors():
<?php
// A valid date — parsing succeeds.
$result = date_create_from_format('Y-m-d', '2022-01-15');
if ($result === false) {
// This branch is skipped because the date is valid.
print_r(date_get_last_errors());
} else {
echo "Parsed successfully: " . $result->format('Y-m-d');
}
?>Вывод:
Parsed successfully: 2022-01-15Поскольку $result является допустимым объектом DateTime, мы никогда не вызываем date_get_last_errors() — полностью избегая зависящего от версии сюрприза с false против array.
Практический рабочий процесс отладки
При обработке разбора дат в продакшне следуйте этой схеме для безопасного захвата и журналирования проблем:
- Вызовите функцию создания даты (например,
date_create_from_format()илиDateTime::createFromFormat()). - Проверьте, равен ли результат
false. - Если
false, вызовитеdate_get_last_errors()для проверки массивовwarningsиerrors. - Журналируйте или отображайте конкретные коды предупреждений/ошибок и сообщения, чтобы определить точную проблему разбора, не останавливая работу приложения.
Параметры
Функция date_get_last_errors() не принимает параметров. Она просто возвращает информацию о последней ошибке или предупреждении, связанном с датой (ассоциативный array или false в PHP 8.2+, если ошибок не было).
Объектно-ориентированный эквивалент
Если вы работаете с классом DateTime вместо процедурных функций, та же информация доступна через статический метод DateTime::getLastErrors():
<?php
$result = DateTime::createFromFormat('Y-m-d', 'not-a-date');
if ($result === false) {
print_r(DateTime::getLastErrors());
}
?>Вывод:
Array
(
[warning_count] => 0
[warnings] => Array
(
)
[error_count] => 3
[errors] => Array
(
[0] => A four digit year could not be found
[10] => Not enough data available to satisfy format
)
)На этот раз строка вовсе не поддаётся разбору, поэтому проблемы сообщаются как ошибки (не предупреждения). DateTime::getLastErrors() возвращает идентичную структуру, что и date_get_last_errors(), и следует тем же правилам версионирования, описанным выше.
Связанные функции
date_create_from_format()— разбор строки даты по явному формату; функция, чьи ошибки вы здесь проверяете.date_create()— создание объектаDateTimeиз гибкой строки даты.checkdate()— проверка григорианской даты перед попыткой её разбора.date()— форматирование метки времени, когда у вас уже есть допустимая дата.
Заключение
Функция date_get_last_errors() — ценный инструмент для любого PHP-разработчика, которому нужно отлаживать ошибки, связанные с датами. Открывая конкретное предупреждение или ошибку, возникшую во время последней операции с датой/временем, она позволяет отлаживать проблемы разбора, не останавливая работу приложения. Запомните две ключевые привычки: всегда ветвьтесь на основе собственного возвращаемого значения функции даты (false) и учитывайте изменение в PHP 8.2+, где сама date_get_last_errors() возвращает false, если всё прошло нормально.