PHP 8.5: Тихие убийцы багов или почему стоит обратить внимание на новую версию

PHP 8.5: Тихие убийцы багов или почему стоит обратить внимание на новую версию

Привет, коллеги!
Как PHP-разработчик, я изучил правки в тестовой версии PHP 8.5. И спешу поделиться открытием: среди скучных технических исправлений спрятаны настоящие «тихие убийцы» багов — изменения, которые предотвратят множество странных ошибок в вашем коде.

Безопасность почты: исправлен heap overflow в mail()

Что было: В функции mail() обнаружили уязвимость переполнения буфера при работе с пустыми сообщениями в режиме LF.

Почему это важно: Если вы отправляете почту через встроенную функцию mail(), ваш сервер мог быть уязвим. Это не теоретическая угроза — такие уязвимости часто используют для атак.

Что делать: После обновления до 8.5 можете спать спокойнее. Но в любом случае рекомендую использовать специализированные библиотеки вроде Symfony Mailer или PHPMailer.

Конец эпохи: __sleep() и __wakeup() помечены как устаревшие

Что было: Магические методы сериализации работали десятилетиями, но имели фундаментальные проблемы с надежностью.

Почему это важно:

// Старый подход (теперь soft-deprecated) public function __sleep() { return ['property1', 'property2']; } // Новый подход (рекомендуется) public function __serialize(): array { return ['property1' => $this->property1, 'property2' => $this->property2]; }

Что делать: Пора переходить на __serialize() и __unserialize(). Пока это «мягкое» устаревание, но в PHP 9.0 эти методы могут исчезнуть.

Null больше не ключ массива

Что было: $array[null] молча преобразовывался в $array[''] или $array[0], создавая неочевидные баги.

Почему это важно:

$data = ['test' => 'value']; // Раньше: молча работало (иногда) // PHP 8.5: Deprecation warning! if (array_key_exists(null, $data)) { // Этот код мог неожиданно срабатывать }

Что делать: Проверить код на использование null как ключа массива. Чаще всего это ошибка логики.

FPM наконец-то правильно читает .user.ini

Что было: Директива post_max_size в .user.ini применялась слишком поздно, что могло обходить ограничения размера загружаемых файлов.

Почему это важно: Это касается безопасности! Если вы разрешаете пользователям настраивать свои сайты через .user.ini, теперь ограничения будут работать корректно.

NAN и непредставимые float теперь кричат о помощи

Что было: Приведение NAN к integer молча давало 0, скрывая серьезные математические ошибки.

Почему это важно:

$result = some_calculation(); // возвращает NAN $id = (int) $result; // Раньше: $id = 0 (тихо) // PHP 8.5: Warning + $id = 0

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

Что еще в копилку?

  • PDO методы-изгои: Драйвер-специфичные методы вроде PDO::pgsqlCopyToArray() помечены устаревшими
  • Многобайтовый ord(): ord("Привет") теперь вызовет предупреждение
  • Стабильность JIT: Десятки исправлений в Opcache делают JIT надежнее

Выводы

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

Стоит ли обновляться? Однозначно да. Но подготовьтесь:

  1. Включите отображение deprecation warnings в development
  2. Протестируйте свой код на RC-версии PHP 8.5
  3. Особое внимание уделите коду, связанному с сериализацией и работой с массивами

Дополнительно о новых функциях и других изменениях можно прочитать здесь.

3
Начать дискуссию