Технические релизы

Взгляните на новые возможности PHP 8

Узнайте о новых блестящих функциях, которые предлагает вам PHP 8

История PHP

PHP не всегда был таким крутым, как сегодня. В те времена все было беспорядочно и совершенно не сравнивалось со строго типизированными языками. Но он был достаточно универсальным, чтобы стать доменом Интернета. Другие языки растут и угрожают домену PHP в разработке веб-приложений. Прямо перед PHP 7 многие люди считали, что PHP уже мертв.

Появляется PHP 7 и все меняет, значительно улучшая производительность. Представляем типы и другие функции. Пришло время PHP 8 развиваться и продолжать наследие PHP.

PHP 8 - это крупное обновление популярного динамического языка для серверного веб-программирования. Теперь доступен как производственный выпуск, включающий типы объединения, именованные аргументы, атрибуты и компиляцию Just-In-Time.

Какие новые функции shine в PHP 8?

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

Теперь вы назвали аргументы, которые позволяют указать только необходимые аргументы и пропустить необязательные. Таким образом, аргументы также независимы от порядка и самодокументированы. Вот пример функции htmlspecialchars, у которой есть несколько необязательных аргументов:

# htmlspecialchars signature
htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = TRUE ]]] ) : string
# you can call it like this
htmlspecialchars($string, double_encode: false);

Атрибуты

Используйте структурированные данные с собственным синтаксисом PHP вместо аннотаций PHPDoc. Это выглядит так:

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

Продвижение собственности конструктора

Более чистый способ определения и инициализации свойств. Более лаконично, с меньшим количеством кода, но все же читаемым, вы можете настроить свойства класса, передав переменные с тем же именем в качестве аргумента в конструктор. См. Пример ниже:

# use this
class Point {
  public function __construct(
    public float $x = 0.0,
    public float $y = 0.0,
    public float $z = 0.0,
  ) {}
}
# instead of this
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 7 вы можете комбинировать типы с PHPDoc. Теперь PHP 8 поддерживает это изначально. Я думаю, что эта новая функция очень полезна, потому что мне не нравится PHPDoc, потому что, на мой взгляд, это затрудняет чтение кода. Вот как это происходит:

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

new Number('NaN'); // TypeError

Выражение соответствия

Добавлена ​​возможность выражения соответствия, аналогичная переключателю, но с более безопасной семантикой и возможностью возвращать значения.

Это выражение, поэтому вы можете сохранить его в переменной или вернуть. Поддерживаются только однострочные выражения и нет необходимости в перерыве; утверждение. Я до сих пор не уверен в том, какое реальное применение я могу дать, но уверен, что когда-нибудь в будущем это пригодится:

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

Оператор Nullsafe

Благодаря этому вам больше не нужно проверять каждый элемент в цепочке вызовов. Когда оценка одного элемента терпит неудачу, выполнение всей цепочки прерывается и оценивается как null. Теперь нет необходимости проверять, существует ли элемент цепочки:

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

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

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

# PHP 7
0 == 'foobar' // true
# PHP 8
0 == 'foobar' // false

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

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

# 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

И многое другое

Производительность и обработка ошибок также были улучшены, и результаты выглядят многообещающими. Я не могу дождаться, когда возьмусь за это.

PHP становится все лучше и лучше с возрастом. В PHP 8 есть гораздо больше, что мне нужно протестировать и выяснить, насколько он будет полезен в реальном мире. Но из того, что я уже вижу, это выглядит многообещающим и заставляет меня гордиться тем, что я работаю с PHP.

Все фрагменты взяты с https://www.php.net/releases/8.0/en.php