Обновление языка PHP до версии 8.2

Обновление языка PHP до версии 8.2

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 работает.
  • Методы 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у старел.