PHP 8.2 — это крупное обновление языка PHP. Он содержит множество новых функций, включая классы только для чтения, null, false и true в качестве автономных типов, устаревшие динамические свойства, улучшения производительности и многое другое.
Классы только для чтения
PHP < 8.2
class BlogData
{
public readonly string $title;
public readonly Status $status;
public function __construct(string $title, Status $status){
$this->title = $title;
$this->status = $status;
}
}
PHP 8.2
readonly class BlogData
{
public string $title;
public Status $status;
public function __construct(string $title, Status $status){
$this->title = $title;
$this->status = $status;
}
}
Типы дизъюнктивной нормальной формы
PHP < 8.2
class Foo {
public function bar(mixed $entity) {
if ((($entity instanceof A) && ($entity instanceof B)) || ($entity === null)) {
return $entity;
}
throw new Exception('Invalid entity');
}
}
PHP 8.2
class Foo {
public function bar((A&B)|null $entity) {
return $entity;
}
}
Типы DNF позволяют нам комбинировать типы объединения и пересечения , следуя строгому правилу: при объединении типов объединения и пересечения типы пересечения должны быть сгруппированы скобками.
Разрешить null, false и true как автономные типы
PHP < 8.2
class Falsy
{
public function almostFalse(): bool { /* ... */ *}
public function almostTrue(): bool { /* ... */ *}
public function almostNull(): string|null { /* ... */ *}
}
PHP 8.2
class Falsy
{
public function alwaysFalse(): false { /* ... */ *}
public function alwaysTrue(): true { /* ... */ *}
public function alwaysNull(): null { /* ... */ *}
}
Новое «случайное» расширение
use Random\Engine\Xoshiro256StarStar;
use Random\Randomizer;
$blueprintRng = new Xoshiro256StarStar(
hash('sha256', "Example seed that is converted to a 256 Bit string via SHA-256", true)
);
$fibers = [];
for ($i = 0; $i < 8; $i++) {
$fiberRng = clone $blueprintRng;
// Метод 'jump()' Xoshiro256** перемещает схему вперед на 2**128 шагов, как если бы вызывался// 'generate()' 2**128 раз, что дает Fiber 2**128 уникальных значений без необходимости повторного заполнения.
$blueprintRng->jump();
$fibers[] = new Fiber(function () use ($fiberRng, $i): void {
$randomizer = new Randomizer($fiberRng);
echo "{$i}: " . $randomizer->getInt(0, 100), PHP_EOL;
});
}
// По умолчанию рандомизатор будет использовать CSPRNG.
$randomizer = new Randomizer();
// Несмотря на то, что волокна выполняются в случайном порядке, они будут печатать одно и то же значение
// каждый раз, потому что у каждого свой уникальный экземпляр ГСЧ.
$fibers = $randomizer->shuffleArray($fibers);
foreach ($fibers as $fiber) {
$fiber->start();
}
Расширение random предоставляет новый объектно-ориентированный API для генерации случайных чисел. Вместо того, чтобы полагаться на генератор случайных чисел (RNG) с глобальным заполнением, использующий алгоритм Mersenne Twister, объектно-ориентированный API предоставляет несколько классов («движков»), обеспечивающих доступ к современным алгоритмам, которые сохраняют свое состояние в объектах, чтобы обеспечить несколько независимых последовательностей.
Класс \Random\Randomizer предоставляет высокоуровневый интерфейс для использования случайности движка для генерации случайного целого числа, для перетасовки массива или строки, для выбора случайных ключей массива и многого другого.
Константы в трейтах
PHP < 8.2
trait Foo
{
public const CONSTANT = 1;
}
PHP 8.2
class Bar
{
use Foo;
}
var_dump(Bar::CONSTANT); // 1
var_dump(Foo::CONSTANT); // Error
Вы не можете получить доступ к константе через имя трейта, но вы можете получить доступ к константе через класс, который использует трейт.
Устаревшие динамические свойства
PHP < 8.2
class User
{
public $name;
}
$user = new User();
$user->last_name = 'Doe';
$user = new stdClass();
$user->last_name = 'Doe';
PHP 8.2
class User
{
public $name;
}
$user = new User();
$user->last_name = 'Doe'; // Deprecated notice
$user = new stdClass();
$user->last_name = 'Doe'; // Still allowed
Создание динамических свойств устарело, чтобы избежать ошибок и опечаток, если только класс не соглашается на это с помощью #[\AllowDynamicProperties] атрибута. stdClass допускает динамические свойства.
Это изменение не влияет на использование магических методов __get/__set
Новые классы, интерфейсы и функции
- Новая
mysqli_execute_query
функция иmysqli::execute_query
метод. - Новые
#[\AllowDynamicProperties]
и#[\SensitiveParameter]
атрибуты. - Новые методы
ZipArchive::getStreamIndex
,ZipArchive::getStreamName
и .ZipArchive::clearError
- Новые
ReflectionFunction::isAnonymous
иReflectionMethod::hasPrototype
методы. - Новые
curl_upkeep
,memory_reset_peak_usage
,ini_parse_quantity
,libxml_get_external_entity_loader
,sodium_crypto_stream_xchacha20_xor_ic
,openssl_cipher_key_length
функции.
Прекращение поддержки и нарушение обратной совместимости
- Устаревшая
${}
интерполяция строк. - Устарело
utf8_encode
иutf8_decode
работает. - Methods
DateTime::createFromImmutable
иDateTimeImmutable::createFromMutable
имеет предварительный тип возвращаемого значенияstatic
. - Расширения
ODBC
иPDO_ODBC
экранирование имени пользователя и пароля. - Функции
strtolower
иstrtoupper
больше не зависят от региональных настроек. - Методы
SplFileObject::getCsvControl
,SplFileObject::fflush
,SplFileObject::ftell
,SplFileObject::fgetc
иSplFileObject::fpassthru
обеспечивают их подпись. - Метод
SplFileObject::hasChildren
имеет предварительный тип возвращаемого значенияfalse
. - Метод
SplFileObject::getChildren
имеет предварительный тип возвращаемого значенияnull
. - Внутренний метод
SplFileInfo::_bad_state_ex
устарел.