Накратко: 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 вече няма официални актуализации. Който е останал там, трябва да надгради и при това новостите помагат малко, а несъвместимостите много.
Сигурен път за надграждане в пет стъпки:
- Определете целевата версия, съобразена със системните изисквания на производителя и с цикъла на издаване.
- Приведете зависимостите чрез Composer и добавките към съвместими състояния.
- Проверете кода със статичен анализ и тестове спрямо целевата версия.
- Изпробвайте в тестова среда с копие на производствени данни и анализирайте дневниците за оттегляния.
- Преминете, рестартирайте всички 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.