Что нового в PHP 8.1?

RedDeveloper
17.03.2022 17:41
Что нового в PHP 8.1?

Если вы все еще используете PHP 7, то эта статья для вас. В PHP 8, а именно в PHP 8.1, встроены некоторые очень востребованные функции, которые вам необходимо знать. Это сделает вашу жизнь программиста намного проще.

В этой статье я покажу вам способ PHP 7, а затем покажу способ PHP 8. Давайте перейдем к делу.

NULLSafe операторы

Если вы использовали оператор null coalescing в прошлом, вы, вероятно, также заметили его недостатки: null coalescing не работает в вызовах методов.

Оператор nullsafe обеспечивает функциональность, аналогичную null coalescing, но также поддерживает вызовы методов.

Оператор NULLSafe позволит вам проверять нули в методе, поэтому нет необходимости в операторе IF в самом ответе. Вместо этого вы просто добавите ? после метода, чтобы проверить его на возврат нуля.

PHP 7

class User {
public function getProfile() {
return null;
return new Profile;
}}
class Profile{
public function getTitle() {
return null;
return "Software Engineer
"; }}
$user = new User;
$profile = $user->getProfile();
/*pre
null coalescingif
($profile) {
if ($profile->getTitle()) {
echo $profile->getTitle();
}else{
echo 'Not provided'
; }}*/.
/* коалесценция null */echo
($profile ? ($profile->getTitle() ? 'Not provided') : 'Not provided');

Вход в полноэкранный режимВыход из полноэкранного режима

PHP 8

class User {
public function getProfile() {
//return null;
return new Profile;
}}
class Profile{
public function getTitle() {
//return null;
return "Software Engineer
"; }}
$user = new User;
$profile = $user->getProfile();
//использует оператор NULL после метода getProfile() cho
$user->getProfile()?->getTitle() ?? 'Not provided';

Вход в полноэкранный режимВыход из полноэкранного режима

Конструктор Продвижение свойств

Продвижение свойств позволяет объединить поля класса, определение конструктора и назначение переменных в одном синтаксисе, в списке параметров конструктора.

Отбросьте все свойства класса и назначения переменных, а в параметрах конструктора поставьте префикс public, protected или private. PHP примет этот новый синтаксис и преобразует его в нормальный синтаксис под капотом, перед тем как выполнить код.

ПРИМЕЧАНИЕ: Продвинутые свойства можно использовать только в конструкторах.

PHP 7

class Signup {
protected UserInfo $user;
protected PLanInfo $plan;
public function __construct(UserInfo $user, PlanInfo $plan) {
$this->user = $user;
$this->plan = $plan;
}}
class UserInfo {
protected string $username;
public function __construct($username) {
$this->username = $username;
}}
class PlanInfo {
protected string $name;
public function __construct($name = 'yearly') {
$this->name = $name;
}}
$userInfo = new UserInfo('Test Account');
$planInfo = new PlanInfo('monthly');
$signup = new Signup($userInfo, $planInfo);

Вход в полноэкранный режимВыход из полноэкранного режима

PHP 8

class Signup {
public function __construct(protected UserInfo $user, protected PlanInfo $plan) {
}}
class UserInfo {
public function __construct(protected string $username) {
}}
class PlanInfo {
public function __construct(protected string $name = 'yearly') {
}}
$userInfo = new UserInfo('Test Account');
$planInfo = new PlanInfo('monthly');
$signup = new Signup($userInfo, $planInfo);

Вход в полноэкранный режимВыход из полноэкранного режима

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

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

ПРИМЕЧАНИЕ: Match будет выполнять строгую проверку типов вместо свободной. Это все равно, что использовать === вместо ==.

PHP 7

$test = 'Send';
switch ($test) {
case 'Send'
: $type = 'send_message'
; break;
case 'Remove'
: $type = 'remove_message'
; break;
}echo
$type;

Вход в полноэкранный режимВыход из полноэкранного режима

PHP 8

$test = 'Send';
$type = match ($test) { '
Send'=>'send_message', '
Remove'=>'remove_message'
};
echo $type;

Вход в полноэкранный режимВыход из полноэкранного режима

$object::class

Теперь можно получить имя класса объекта с помощью $object::class. Результат тот же, что и при использовании get_class($object).

Если вы работаете с php достаточно долго, я думаю, вы пробовали использовать синтаксис класса, например, Class::method или get_class(new Class()) для получения имени класса в виде строки. Однако, если вы присваиваете динамическое имя класса переменной и используете синтаксис класса, например, $object::class, вы получите ошибку "Cannot use ::class with dynamic class name". В PHP 8 вы можете это сделать.

PHP 7
N/A: показывает ошибку

PHP 8

class Send{}$message
= new Send();
$type = match ($message::class) { '
Send'=>'send_message', '
Remove'=>'remove_message'
};

Вход в полноэкранный режимВыход из полноэкранного режима

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

Именованные аргументы позволяют передавать входные данные в функцию, основываясь не на порядке следования аргументов, а на их названии. Этот тип функциональности полезен для отслеживания того, что что означает. Если вы вернетесь к своему коду и увидите, где вы вызываете метод, вы можете запутаться, что именно вы вызываете.

Именованные параметры помогают предотвратить это. Они дают вам возможность сообщить своему будущему "я", какой тип переменных вы присваиваете методу, без необходимости копаться в коде и выяснять, что он делает.

ПРИМЕЧАНИЕ: Если имена ваших аргументов в методе изменятся, это приведет к поломке кода, так как именованный параметр больше не будет действительным.

PHP 7

class Invoice {
private $customer;
private $amount;
private $date;
public function __construct($customer, $amount, $date) {
$this->customer = $customer;
$this->amount = $amount;
$this->date = $date;
}}
$invoice = new Invoice( '
Test Account'
, 100,
new DateTime
);

Вход в полноэкранный режимВыход из полноэкранного режима

PHP 8

class Invoice {
public function __construct(private string $customer, private int $amount, private dateTime $date) {}}
$invoice = new Invoice(
customer: 'Test Account'
, amount: 100,
дата: new DateTime
);

Вход в полноэкранный режимВыход из полноэкранного режима

Помощники для работы со строками

Вы когда-нибудь хотели найти строку в строке в PHP? Скорее всего, да, и скорее всего, вы знаете, что это мучение, поскольку до PHP 8 не было функции поиска для этой цели, несмотря на то, что это один из самых востребованных элементов PHP с момента его создания.

В прошлом вам нужно было понять, как работает математика и подобрать определенные параметры, но теперь это ушло в прошлое, и наступило будущее подбора строк.

PHP 7

$string = 'inv_1234_mid_67890_rec';
echo 'Начинается с inv_: '.(substr_compare($string, 'inv_', 0, strLen('_inc')) === 0 ? "Да" : "Нет");
echo 'Заканчивается на _rec: '.(substr_compare($string, '_rec', -strLen('_rec')) === 0 ? "Да" : "Нет");
echo 'Содержит _mid_: '.(strpos($string, '_mid_') ? "Да" : "Нет");

Вход в полноэкранный режимВыход из полноэкранного режима

PHP 8

$string = 'inv_1234_mid_67890_rec';
echo 'Начинается с inv_: '.(str_starts_with($string, 'inv_') ? "Yes" : "No");
echo 'Заканчивается на _rec: '.(str_ends_with($string, '_rec') ? "Yes" : "No");
echo 'Contains _mid_: '.(str_contains($string, '_mid_') ? "Yes" : "No");

Вход в полноэкранный режимВыход из полноэкранного режима

Объединение и псевдотипы

В версиях до PHP 8.0 вы могли объявлять только один тип для свойств, параметров и возвращаемых типов. PHP 7.1 и более новые версии имеют nullable типы, что означает, что вы можете объявить тип как null с помощью объявления типа, подобного ?string или с помощью комментариев PHPDoc.

Начиная с PHP 8.0, вы можете объявлять более одного типа для аргументов, типов возврата и свойств класса.

PHP 7

класс Foo {
public function bar(?Foo $foo) {
echo 'Complete '

; }}
$one = new Foo;
$two = new Foo;
$two->bar($one);
$two->bar(null);
// строка не работает, так как ожидает Foo или Null$two->bar
('Test');

Вход в полноэкранный режимВыход из полноэкранного режима

PHP 8

класс Foo {
public function bar(Foo|string|null $foo) {
echo 'Complete '

; }}
$one = new Foo;
$two = new Foo;
// все работает$two->bar
($one);
$two->bar(null);
$two->bar('Test');

Вход в полноэкранный режимВыход из полноэкранного режима

Заключение

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?

20.08.2023 18:21

Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией

20.08.2023 17:46

В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox

19.08.2023 18:39

Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest

19.08.2023 17:22

В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!

Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️

18.08.2023 20:33

Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL

14.08.2023 14:49

Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.