Текуща ситуация: PHP2Shell. Две критични уязвимости в PHP (CVSS 9,2) позволяват злонамерен код без вход. Корекции от 21.10.2026 г.Какво да направите сега →

PHP 8.0 до 8.5: най-важните новости

От match и JIT в PHP 8.0 до pipe оператора и URI разширението в PHP 8.5: новостите на всяка версия, клопките при надграждане и какво носят за сигурността.

Актуалност 5 мин. четенеЗнания за PHP

Накратко: PHP 8.0 (ноември 2020 г.) донесе именувани аргументи, атрибути, обединени типове, match, nullsafe оператора и JIT компилатор. След това следваха ежегодно: 8.1 с Enums и Fibers, 8.2 с readonly класове, 8.3 с типизирани константи на класове, 8.4 с Property Hooks и 8.5 с pipe оператор и URI разширение. Всяка версия оттегля и стари неща. При надграждането затова значение имат тестовете, а за сигурността е най-важно да се експлоатира поддържан клон с актуално състояние на корекциите.

Новостите в PHP 8 накратко

Таблицата обобщава основните точки от страниците за издания на php.net. Датите на първото издаване са според php.net.

Версия Издадена Най-важни новости Избрани оттегляния и несъвместимости
8.0 26.11.2020 именувани аргументи, атрибути, Constructor Property Promotion, обединени типове, match, ?->, JIT 0 == 'foobar' вече е false, грешки на типове вместо предупреждения
8.1 25.11.2021 Enums, readonly свойства, First-Class-Callables strlen(...), new в инициализатори, пресечни типове, never, Fibers –
8.2 08.12.2022 readonly класове, DNF типове, null/false/true като типове, разширение Random, константи в traits, #[\SensitiveParameter] динамичните свойства са оттеглени
8.3 23.11.2023 типизирани константи на класове, #[\Override], json_validate(), mb_str_pad(), php -l за няколко файла –
8.4 21.11.2024 Property Hooks, асиметрична видимост, #[\Deprecated], нов DOM API с HTML5, BcMath\Number, array_find(), Lazy Objects неявно nullable параметри са оттеглени; IMAP, OCI8, PDO_OCI, pspell към PECL
8.5 20.11.2025 pipe оператор, URI разширение, Clone With, #[\NoDiscard], array_first()/array_last() операторът с обратни кавички е оттеглен, disable_classes е премахнат

PHP 8.0 и 8.1: голямата стъпка

PHP 8.0 направи езика осезаемо по-строг и по-изразителен. Според страницата за издание вътрешните функции вече последователно хвърлят TypeError или ValueError, вместо само да извеждат предупреждения. Сравненията между числа и низове следват по-чисти правила.

<?php
// PHP 8.0: match сравнява строго и не се нуждае от break
$status = 404;
echo match (true) {
    $status >= 500 => 'Serverfehler',
    $status >= 400 => 'Anfragefehler',
    default        => 'in Ordnung',
};

// PHP 8.0: nullsafe оператор
$land = $bestellung?->kunde?->adresse?->land;

PHP 8.1 донесе Enums, т.е. изброими типове с фиксирани стойности, и readonly свойства, които могат да бъдат зададени само веднъж:

<?php
enum Rolle: string {
    case Leser = 'leser';
    case Redakteur = 'redakteur';
    case Admin = 'admin';
}

final class Benutzer {
    public function __construct(
        public readonly string $name,
        public readonly Rolle $rolle,
    ) {}
}

$b = new Benutzer('Erika', Rolle::from('redakteur'));

Rolle::from() хвърля грешка при неизвестни стойности. Това не позволява произволни низове от формуляри да се промъкнат като роля. Който вместо грешка се нуждае от празна стойност, ползва Rolle::tryFrom(), която при неизвестни стойности връща null.

Нови в 8.1 са и Fibers, основа за конкурентни процеси, върху която се градят библиотеки за асинхронна обработка. При нормалната експлоатация на уебсайтове от това се забелязва малко, а в съвременните framework-ове и опашки повече.

PHP 8.2 и 8.3: подреждане и укрепване

PHP 8.2 оттегли динамичните свойства. Който присвои на обект недекларирано свойство, получава съобщение; с #[\AllowDynamicProperties] това може да се разреши за отделни класове. По-старите добавки затова често генерират много съобщения в дневника.

За сигурността са интересни новото разширение Random, чийто стандартен randomizer според страницата за издание ползва криптографски сигурен генератор на случайни числа, и атрибутът #[\SensitiveParameter], който скрива стойности като пароли в stack trace. Повече за сигурните случайни стойности в Сигурни случайни числа и токени в PHP.

PHP 8.3 добави типизирани константи на класове, атрибута #[\Override] срещу правописни грешки при презаписване на методи и json_validate(), която проверява JSON, без да го декодира изцяло.

PHP 8.4 и 8.5: съвременни езикови средства

PHP 8.4 въведе Property Hooks, т.е. логика директно върху свойствата, и асиметрична видимост като public private(set). Към тях се добавиха нов DOM API с поддръжка на HTML5 и функции като array_find(), array_any() и array_all(). Според страницата за издание разширенията IMAP, OCI8, PDO_OCI и pspell са преместени от ядрото към PECL. Приложенията, които ползват например IMAP, тогава се нуждаят от отделен пакет.

PHP 8.5 донесе pipe оператора, който свързва извикванията отляво надясно:

<?php
$slug = '  Neue Produkte 2026  '
    |> trim(...)
    |> strtolower(...)
    |> (fn(string $s): string => str_replace(' ', '-', $s));
// Резултат: "neue-produkte-2026"

Ново е и URI разширение, което разчленява адреси според RFC 3986 и стандарта WHATWG URL. Това е важно за сигурността, защото неединно разчленените URL адреси са позната причина за заобиколени проверки. Операторът с обратни кавички като кратка форма на shell_exec() е оттеглен, настройката disable_classes е премахната. Който я е ползвал, трябва да адаптира заздравяването си.

Новости, надграждане и PHP2Shell

Новите езикови функции не затварят уязвимости в интерпретатора. Срещу PHP2Shell помага само актуалното състояние на корекциите на съответния клон: 8.5.12, 8.4.27, 8.3.36 или 8.2.35. За PHP 8.1 и 8.0 вече няма официални актуализации. Който е останал там, трябва да надгради и при това новостите помагат малко, а несъвместимостите много.

Сигурен път за надграждане в пет стъпки:

  1. Определете целевата версия, съобразена със системните изисквания на производителя и с цикъла на издаване.
  2. Приведете зависимостите чрез Composer и добавките към съвместими състояния.
  3. Проверете кода със статичен анализ и тестове спрямо целевата версия.
  4. Изпробвайте в тестова среда с копие на производствени данни и анализирайте дневниците за оттегляния.
  5. Преминете, рестартирайте всички PHP процеси и документирайте състоянието.

Предистория за типовете дава Типовата система на PHP.

Как помага PHP SOS конкретно?

  • Проверка на съвместимостта: Анализираме Вашия код и разширения за несъвместимости с целевата версия.
  • Извършване на надграждането: С миграцията към поддържана версия на PHP надграждаме приложенията, тествани.
  • Адаптиране на заздравяването: Заменяме премахнатите настройки като disable_classes с действащи алтернативи.
  • Поддържане на състоянието на корекциите: След надграждането поддържаме клона актуален и доказваме всяко рестартиране.

Често задавани въпроси

Коя версия на PHP 8 да използвам днес?

За нови проекти PHP 8.4 или 8.5, защото те се поддържат най-дълго: 8.4 до края на 2028 г., 8.5 до края на 2029 г. Решаващо е какво поддържа Вашето приложение според системните изисквания на производителя. PHP 8.2 приключва на 31 декември 2026 г.

Какво се чупи най-често при преминаване от PHP 7.4 към PHP 8?

Често това са по-строгите проверки на типовете: вътрешните функции в PHP 8 хвърлят TypeError или ValueError, вместо само да извеждат предупреждения. Забелязват се и променените сравнения между числа и низове. Статичният анализ и тестовете разкриват повечето предварително.

Прави ли JIT моя уебсайт по-бърз?

Най-често почти не. Според страницата за издание на PHP 8.0 производителността на типичните уеб приложения е приблизително на нивото на PHP 7.4, докато изчислително интензивни задачи могат значително да спечелят. От PHP 8.4 JIT е изключен по подразбиране.

Кои новости помагат на сигурността?

Между другото новото разширение Random в PHP 8.2 с криптографски сигурен стандарт, атрибутът SensitiveParameter срещу пароли в stack trace, Enums и readonly свойства за по-еднозначни данни, както и по-последователните грешки на типовете от PHP 8.0.

Източници

Незабавен контакт

Всеки час има значение. Пишете ни сега.

Опишете накратко системата, версията на PHP и какво сте забелязали. Ние се свързваме с Вас, уточняваме ситуацията и работим отдалечено, докато инцидентът бъде приключен и документиран.

Незабавна помощ