PHP 8 — что нового в 8-ой версии php

Оглавления для удобной навигации по новым PHP 8.0 фичам (клик для перехода):

  1. Новые строковые функции
  2. Named Arguments
  3. Constructor property promotion
  4. Match expression
  5. Union types
  6. Attributes

PHP 8.0 Что нового: новые фичи php 8

1. Новые нативные функции для работы со строками

str_contains — для проверки есть ли подстрока в строке.

str_contains(string $haystack, string $needle): bool

str_starts_with, str_ends_with — функции для проверки "начинается ли строка с" и "заканчивается ли строка на"

str_starts_with(string $haystack, string $needle): bool
str_ends_with  (string $haystack, string $needle): bool

2. Named arguments

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

function namedArgExample(string $arg1, array $arg2 = [], array $arg3 = [], bool $arg4 = false);

namedArgExample('string', arg4: true);

В PHP < 8 мы бы вызывали так:

namedArgExample('string', [], [], true)

3. "Constructor property promotion" или просто "Constructor promotion"

Для меня, это одна из самых полезных фичей новой версии, которая позволяет экономить время разработки и рефакторинга.

Прямо в конструкторе можно указать модификтор доступа любого аргумента будь то private / protected / public, тогда property с таким именем можно нужно не объявлять вовсе. Как можно заметить, никакое присваивание в теле конструктора тоже не нужно, наличие модификатора доступа в конструкторе PHP 8.0 -- автоматически создает проперти с именем, равным именем переменной и присваивает параметр в property.

class A
{
    public function __construct(
        private B $b,
        private RouterInterface $router
    ) {
    }
}

В версиях PHP < 8 мы бы писали так (почти в 3 раза! больше кода!):

class A
{
    private B $b;
    private RouterInterface $router;

    public function __construct(
        private B $b,
        private RouterInterface $router
    ) {
        $this->b = $b;
        $this->router = $router;
    }
}

Используя DI, autowiring и constructor promotion — теперь сплошное удовольствие при подстановке зависимостей в сервис.

Конструктор property промоушен new PHP 8.0 feature

4. match expression

Match expression (см. https://www.php.net/manual/en/control-structures.match.php) — более емкий и читаемый вариант для оператора switch. Есть и отличие от switch: match всегда использует строгое сравнение. Отпадает необходимость в break.

$var = 2;

echo match ($var) {
    2 => 'two',
    3 => 'three',
    default => 'none',
};

Итого про match:

не любой switch можно заменить на match. Вместо простых switch можно использовать более читаемый и емкий match.

5. Union types

class UnionTypeExample
{
    private City|false|null $city = null;
}

В этом случае в проперти $this->city можно будет присовить только типы false, null или объект City.

То, что раньше описывали c помощью phpdoc /** @var false|null */ теперь можно легально описать языковой конструкцией.

Кроме types properties, Union types можно использовать как в аргументах, так и в возвращаемых значениях. 

Лучше не увлекаться Union types в PHP, так как все таки это не однозначность в типах.

6. Attributes PHP 8.0 feature

Аттрибуты - фича, которая позволяет использовать языковую конструкцию для добавления мета-данных к классу, функции, проперти. Проблема, которую решают аттрибуты - зависимость кода от PHPDoc комментариев, что очень широко используется в doctrine, symfony и тд. Теперь выполнение кода может зависеть от аттрибутов:) которые являются языковой конструкцией, то есть это более "стандартизированный" подход.

Аттрибуты объявляются с помощью #[ и ]

Было:

/**
 * @Route(path="/", methods={"GET"}, name="main")
 */
public function indexAction(): Response

Стало:

#[Route('/', methods: ['GET'], name: 'main']
public function indexAction(): Response

По поводу синтаксиса аттрибутов было много споров. В PHP все что начинается с # является комментарием. Это значит, что синтаксис аттрибутов #[ не будет вызывать синтаксическую ошибку на более ранних версиях PHP (до PHP 8.0). То есть код с аттрибутами запустится и на более ранних версиях языка, чем когда аттрибуты стали поддерживаться (с PHP 8.0). Другой вопрос, станет ли код на ранних версиях работать ожидаемо:)

 
 
 
 

icon Комментарии 0

Ваш комментарий к статье.. (для авторизованных)

ctrl+enter

icon Вход в систему

зарегистрироваться
НОВЫЕ ПОЛЬЗОВАТЕЛИ