Оглавления для удобной навигации по новым PHP 8.0 фичам (клик для перехода):
- Новые строковые функции
- Named Arguments
- Constructor property promotion
- Match expression
- Union types
- Attributes
- Nullsafe operator
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 — теперь сплошное удовольствие при подстановке зависимостей в сервис.
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 и тд. Теперь выполнение кода может зависеть от аттрибутов:) которые являются языковой конструкцией, то есть это более "стандартизированный" подход.
Аттрибуты в PHP объявляются с помощью символов #[
и ]
Было:
/** * @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). Другой вопрос, станет ли код на ранних версиях работать ожидаемо:)
PHP 8.0: Nullsafe operator feature
Проверка на null при вызове методов может быть осуществлена прямо в вызове с помощью добавления знака ? (вопрос): ?->
$country = $session?->user?->getAddress()?->country;
Если один из объектов в цепочке вызов выше будет null
, то в переменную запишется null
Может быть интересно:
Комментарии 0