PHP 8.2: Основни нововъведения
Полеви бележки за преминаване от PHP 8.1.x към 8.2.x: нови езикови възможности, атрибути срещу изтичане на секрети в stack trace, по-строги низови правила и deprecations, които е добре да изчистите преди следващата версия.
Съдържание
- #[SensitiveParameter] и трасиращи изходи
- Readonly класове
- Самостоятелни типове (
null,false,true) и DNF - Константи в traits и enum в константни изрази
- INI:
error_log_mode - Random разширение
- Разширения: cURL, PCRE
- Обратно несъвместими промени (миграция)
- Deprecated (оправете преди да станат грешки)
- Разширения и runtime
PHP 8.2 нататък наглася езика към по-явни модели: readonly класове, по-богата типова система (вкл. DNF), и #[SensitiveParameter], за да не изтичат пароли в backtrace. Има и промени с реално въздействие в prod: ASCII case без locale за базовите string функции, различно поведение на str_split(''), glob() при open_basedir, плюс deprecation на динамични свойства без изрично позволение.
#[SensitiveParameter] и трасиращи изходи
#[\SensitiveParameter] маркира параметри за редактиране в stack traces — по-малко случайни токени и пароли в логове.
function connect(#[\SensitiveParameter] string $password): void
{
throw new RuntimeException('fail');
}
Атрибутът не замества политика за логове: в production не показвайте сурови изключения на клиента и дръжте чувствителните полета извън слепите копия на грешки.
Практичен рецепт: маркирайте тайни на границата
Слагайте #[\SensitiveParameter] върху параметри, които могат да попаднат в exceptions (client wrappers, auth helper-и). Stack trace остава полезен, но секретите не изтичат в логовете.
final class ApiClient
{
public function __construct(
private readonly string $baseUrl,
#[\SensitiveParameter] private readonly string $token,
) {}
}
Readonly класове
readonly class прави всички instance properties readonly и ги инициализира през конструктора.
readonly class Point
{
public function __construct(
public int $x,
public int $y,
) {}
}
Подходящо за immutable value обекти и DTO, където целият обект трябва да „замръзне“ след конструктора.
Самостоятелни типове (null, false, true) и DNF
null, false и true могат да се ползват като самостоятелни типове в декларации (не само като част от union в по-стари форми).
DNF (нормализирана дизюнктивна форма) комбинира union и intersection — например (A&B)|null за прецизни API без загуба на nullability.
function accepts((Countable&Traversable)|null $c): void {}
Константи в traits и enum в константни изрази
- Константи в traits.
- Свойства на enum в подходящи константни изрази.
INI: error_log_mode
error_log_mode задава права на файла за error log при създаване от PHP.
Random разширение
Разширението Random обединява и разширява API за произволни числа: по-ясни „двигатели“, по-малко хаотично смесване само със стари функции. За нов код с възпроизводими seed или криптографски токени вижте Random\Engine и Random\Randomizer в ръководството.
Практичен рецепт: Randomizer за токени и sampling
$engine = new Random\Engine\Mt19937(random_int());
$randomizer = new Random\Randomizer($engine);
$token = $randomizer->getBytesFromString('0123456789abcdef', 32);
В тестове използвайте seeded engine за възпроизводимост; за секрети изберете криптографски подходящ Random\Engine според документацията.
Разширения: cURL, PCRE
- cURL:
CURLINFO_EFFECTIVE_METHOD,curl_upkeep(), нови константи според libcurl. - PCRE: модификатор
n— обикновените()групи не хващат, само именовани.
Обратно несъвместими промени (миграция)
Дата и час
- Tentative
staticпри factory методите на DateTime / DateTimeImmutable. - По-строги относителни формати за
number.
Стандартна библиотека
- Основните string функции за case — ASCII, не locale; за локал — mbstring.
str_split('')→ празен масив.glob/GlobIteratorприopen_basedir— различно[]/falseи предупреждения.FilesystemIterator—SKIP_DOTSвече не е принудително подразбиране през стари флагове по подразбиране.ksort/krsort: приSORT_REGULARсе прилагат правилата на PHP 8 за числови низове последователно с другите сравнения.var_export— пълно квалифицирани имена на класове (водещата обратна наклонена черта не се пропуска).
ODBC / PDO_ODBC
Екраниране на user/pass при допълване на connection string.
Бележка: при липса на timezone настройки date_default_timezone_get() може да върне UTC — валидирайте допусканията след ъпгрейд.
SPL
Някои методи на SplFileObject спазват по-строго сигнатури; за част от тях са стегнати типовете на връщане (hasChildren, getChildren и др.) — прегледайте наследници.
Deprecated
Динамични свойства
Създаването на динамични свойства върху произволни класове е deprecated, освен ако класът няма #[\AllowDynamicProperties] (или не наследява типове като stdClass, където това е позволено). Предпочитайте декларирани свойства, WeakMap за външни метаданни или явни __get/__set.
Частични callables
Форми, приемани от call_user_func(), но не и от $callable() — напр. "self::method", "parent::method", определени масивни форми — са deprecated. Нормализирайте до Foo::bar или [Class::class, 'method'].
Интерполация на низове
Стилът "${var}" / "${expr}" е deprecated; ползвайте "{$var}" или конкатенация.
Друго
utf8_encode/utf8_decode: deprecated (предпочитайтеmb_convert_encodingилиiconv).
Разширения и runtime
- OpenSSL: AEAD chacha20-poly1305, където сборката го поддържа.
- OCI8: настройка на prefetch за LOB чрез INI и
oci_set_prefetch_lob()на поддържани Oracle версии. - DBA (LMDB): флагове за поведение с поддиректории при създаване на DB файлове.
Обобщение
PHP 8.2 награждава екипите с явни модели: readonly класове, по-богата типова система, по-малко случайни течове чрез #[\SensitiveParameter], а deprecation насочва към декларирани свойства и модерни callables. Заложете време за низове и locale (ASCII case в основните функции), timezone, комбинация open_basedir + glob и регресия на ODBC/PDO_ODBC след промените при екраниране в connection string.