zaLinux.ru

Вышел PHP 8: обзор изменений языка


Вышла стабильная версия PHP 8, бинарные файлы, в том числе для Windows, уже доступны для скачивания.

Бинарные файлы для Windows: https://windows.php.net/download

Что нового в PHP 8

Выпуск содержит крупные изменения в языке PHP, рассмотрим их.

PHP 8.0 содержит множество улучшений и новых функций, таких как:

  • Типы Union
  • Именованные аргументы
  • Выражения match
  • Атрибуты
  • Constructor Property Promotion
  • Оператор Nullsafe
  • Weak Maps
  • Just In Time Compilation
  • И многое другое...

Именованные аргументы

PHP 7

htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

PHP 8

htmlspecialchars($string, double_encode: false);

Указывайте только обязательные параметры, пропуская необязательные.

Аргументы не зависят от порядка и самодокументированы.

Атрибуты

PHP 7

class PostsController
{
    /**
     * @Route("/api/posts/{id}", methods={"GET"})
     */
    public function get($id) { /* ... */ }
}

PHP 8

class PostsController
{
    #[Route("/api/posts/{id}", methods: ["GET"])]
    public function get($id) { /* ... */ }
}

Вместо аннотаций PHPDoc теперь вы можете использовать структурированные метаданные с собственным синтаксисом PHP.

Продвижение свойств конструктора RFC Doc

PHP 7

class Point {
  public float $x;
  public float $y;
  public float $z;

  public function __construct(
    float $x = 0.0,
    float $y = 0.0,
    float $z = 0.0,
  ) {
    $this->x = $x;
    $this->y = $y;
    $this->z = $z;
  }
}

PHP 8

class Point {
  public function __construct(
    public float $x = 0.0,
    public float $y = 0.0,
    public float $z = 0.0,
  ) {}
}

Меньше шаблонного кода для определения и инициализации свойств.

Типы Union RFC Doc

PHP 7

class Number {
  /** @var int|float */
  private $number;

  /**
   * @param float|int $number
   */
  public function __construct($number) {
    $this->number = $number;
  }
}

new Number('NaN'); // Ok

PHP 8

class Number {
  public function __construct(
    private int|float $number
  ) {}
}

new Number('NaN'); // TypeError

Вместо аннотаций PHPDoc для комбинации типов вы можете использовать собственные объявления типа union, которые проверяются во время выполнения.

Выражения match RFC Doc

PHP 7

switch (8.0) {
  case '8.0':
    $result = "Oh no!";
    break;
  case 8.0:
    $result = "This is what I expected";
    break;
}
echo $result;
//> Oh no!

PHP 8


echo match (8.0) {
  '8.0' => "Oh no!",
  8.0 => "This is what I expected",
};
//> This is what I expected

Новый match похож на switch и имеет следующие особенности:

  • match — это выражение, то есть его результат может быть сохранен в переменной или возвращён.
  • Ветви соответствия поддерживают только однострочные выражения и не требуют указания break;
  • match делает строгие сравнения.

Оператор Nullsafe RFC

PHP 7

$country =  null;

if ($session !== null) {
  $user = $session->user;

  if ($user !== null) {
    $address = $user->getAddress();
 
    if ($address !== null) {
      $country = $address->country;
    }
  }
}

PHP 8

$country = $session?->user?->getAddress()?->country;

Вместо нулевых (null) условий проверки теперь вы можете использовать цепочку вызовов с новым nullsafe оператором. Когда оценка одного элемента в цепочке завершается неудачно, выполнение всей цепочки прерывается, и вся цепочка принимает значение null.

Более разумное сравнение строки и числа RFC

PHP 7

0 == 'foobar' // true

PHP 8


0 == 'foobar' // false

При сравнении с числовой строкой PHP 8 использует сравнение чисел. В противном случае он преобразует число в строку и использует сравнение строк.

Ошибки согласованного типа для внутренних функций RFC

PHP 7

strlen([]); // Warning: strlen() expects parameter 1 to be string, array given

array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0

PHP 8

strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given

array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0

Большинство внутренних функций теперь выдают исключение Error, если проверка параметров не выполняется.


Компиляция Just-In-Time

PHP 8 представляет два механизма JIT-компиляции. Tracing JIT, наиболее многообещающая из двух, показывает примерно в 3 раза лучшую производительность на синтетических тестах и в 1,5–2 раза на некоторых конкретных долго работающих приложениях. Типичная производительность приложения на уровне PHP 7.4.

Сравнение производительности JIT в PHP 8

Улучшения в системе типов и обработке ошибок

  • Более строгие проверки типов для арифметических/побитовых операторов RFC
  • Проверка метода абстрактных признаков RFC
  • Правильные сигнатуры магических методов RFC
  • Реклассифицированные предупреждения движка RFC
  • Фатальная ошибка для несовместимых сигнатур методов RFC
  • Оператор @ больше не отключает фатальные ошибки.
  • Наследование частными методами RFC
  • Смешанный тип RFC
  • Статический тип возврата RFC
  • Типы для внутренних функций Email thread
  • Непрозрачные объекты вместо ресурсов для расширений CurlGdSocketsOpenSSLXMLWriter и XML

Прочие настройки и улучшения синтаксиса

  • Разрешить конечную запятую в списках параметров RFC и конечную запятую в списках RFC
  • Разрешить перехват исключений без перехвата их в переменные RFC
  • Изменения синтаксиса переменных RFC
  • Рассматривать имена в пространстве имён как один токен RFC
  • Throw теперь выражение RFC
  • Разрешить ::class для объектов RFC

Новые классы, интерфейсы и функции

Дополнительная информация


Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *