Что нового в 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 7N/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.

Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?

03.02.2023 09:34

Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому дизайну, а размер сборки просто крошечный.

LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу

03.02.2023 08:15

Увеличение подматриц на единицу - LeetCode

Переключение светлых/темных тем
Переключение светлых/темных тем

02.02.2023 09:04

В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно использовать для установки светлых/темных стилей и добавления интерактивных функций с помощью JavaScript. Следуйте инструкциям, и вы готовы к работе!

Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения

02.02.2023 07:39

Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой статье мы расскажем, как создавать и управлять отношениями "многие ко многим" в Laravel с помощью методов присоединения и отсоединения вместо...

В PHP
В PHP

02.02.2023 07:16

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

Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel

01.02.2023 11:27

Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку приложений, такие как маршрутизация, ORM (Object-Relational Mapping), шаблонизация и аутентификация. Laravel имеет архитектуру на основе...