Современный PHP 8.2
Конечно! Вот переписанный и более понятный текст с примерами, вдохновлёнными реальными сценариями из **интернет-магазинов** (например, работа с заказами, пользователями, продуктами и т.д.), чтобы показать полезность новых фич PHP 8.0–8.3 на практике.
---
## ✅ PHP 8.0: Удобные улучшения для интернет-магазина
### 🟩 `match` вместо `switch`
Представь, что тебе нужно вернуть статус заказа по HTTP-коду:
```php
$status = 200;
$message = match ($status) { 200 => 'Заказ успешно обработан', 404 => 'Заказ не найден', 500 => 'Ошибка сервера при обработке заказа',
};
```
💡 В отличие от `switch`, `match`:
- автоматически возвращает значение,
- использует строгое сравнение (`===`),
- код короче и понятнее.
---
### 🟩 Union Types — типы "или"
Ты можешь указать, что переменная может быть строкой или числом — например, ID товара может быть как целым числом, так и строковым UUID:
```php
function printProductInfo(string|int $id): void { echo "Информация о товаре с ID: $id";
}
printProductInfo(123); // OK
printProductInfo("abc-123"); // Также OK
```
---
### 🟩 Constructor Property Promotion
В классе `User` можно сразу объявить свойства прямо в конструкторе:
```php
class User { public function __construct( public string $name, private int $age ) {}
}
```
Это сокращает код — ты не пишешь `$this->name = $name;` каждый раз. Полезно при регистрации пользователей.
---
### 🟩 Attributes (аналог аннотаций)
Например, маршруты в API интернет-магазина можно аннотировать так:
```php
#[Route('/products', methods: ['GET'])]
class ProductController { public function index() { /* вывод товаров */ }
}
```
Более чистый и понятный способ работать с маршрутами, мидлварами и другими метаданными.
---
### 🟩 Named Arguments
Можно передавать аргументы функции по имени, даже если они идут не по порядку:
```php
function connect(string $host, int $port = 3306) {}
connect(port: 3307, host: 'localhost');
```
Полезно при подключении к базе данных, где много параметров.
---
### 🟩 Nullsafe Operator
Если у пользователя может не быть профиля, но хочется получить имя безопасно:
```php
$name = $user?->profile?->name;
```
Не получишь ошибку, если `profile` не установлен. Это спасает от множества проверок `isset()`.
---
## ✅ PHP 8.1: Дополнительные улучшения
### 🟦 readonly свойства
Поля, которые нельзя менять после присвоения. Например, ID пользователя должен быть неизменным:
```php
class User { public readonly string $id;
public function __construct(string $id) { $this->id = $id; }
}
```
Теперь `$user->id = 'new';` вызовет ошибку.
---
### 🟦 Enum — перечисления
Упрощают работу со списками состояний заказов:
```php
enum Status { case Draft; case Published;
}
```
Использование:
```php
$orderStatus = Status::Published;
if ($orderStatus === Status::Published) { echo "Заказ опубликован";
}
```
---
### 🟦 never type
Функция, которая никогда не возвращает значения — например, выбрасывает исключение:
```php
function panic(string $message): never { throw new LogicException($message);
}
```
---
### 🟦 Final class constants
Константы, которые нельзя переопределять в дочерних классах:
```php
class Config { final public const VERSION = '1.0.0';
}
```
---
### 🟦 `new` в default параметрах
Теперь можно создавать объекты по умолчанию прямо в сигнатуре:
```php
function createLogger(Logger $logger = new FileLogger()) {}
```
---
### 🟦 Распаковка массивов с ключами
Слияние массивов с сохранением строковых ключей:
```php
$array1 = ['a' => 1];
$array2 = ['b' => 2];
$result = [...$array1, ...$array2]; // ['a' => 1, 'b' => 2]
```
---
## ✅ PHP 8.2: Упор на безопасность и типизацию
### 🟧 readonly class
Всякий класс помечен `readonly` — его все свойства автоматически `readonly`:
```php
readonly class Point { public function __construct( public int $x, public int $y ) {}
}
```
---
### 🟧 true type
Функция, которая всегда возвращает `true`. Например, проверка авторизации:
```php
function isLoggedIn(): true { if (!auth()->check()) { redirect('/login'); }
return true;
}
```
---
### 🟧 Disjunctive Normal Form Types
Сложные условия в типах:
```php
function process((A&B)|C $value): void {}
```
Где:
- `$value` должен быть либо экземпляром класса `A` и `B`,
- либо экземпляром класса `C`.
---
### 🟧 Использование enum в константах
Теперь энумы можно использовать как значения констант:
```php
enum Status { case Active;
}
class Config { public const DEFAULT_STATUS = Status::Active;
}
```
---
### 🟧 Запрет динамических свойств
В PHP 8.2 добавление динамических свойств генерирует предупреждение:
```php
class User {}
$user = new User();
$user->name = 'Ivan'; // ⚠️ Warning
```
✅ Решение:
```php
class User { public string $name;
}
```
Добавляйте явные свойства — это делает код предсказуемее и безопаснее.
---
## ✅ PHP 8.3: Новые удобности
### 🟨 json_validate()
Проверяет, является ли строка валидным JSON — полезно при работе с API интернет-магазина:
```php
json_validate('{"name": "Ivan"}'); // true
json_validate('{name: "Ivan"}'); // false
```
---
### 🟨 Typed class constants
Теперь константы могут иметь тип:
```php
class App { public const string APP_NAME = 'MyApp';
}
```
Теперь попытка присвоить число или null вызовет ошибку.
---
### 🟨 Anonymous readonly classes
Анонимный класс с только-чтение полями:
```php
$logger = new readonly class { public function log(string $msg): void { echo $msg; }
};
$logger->log("Лог записан");
```
Отлично подходит для временных объектов, например, логгеров или хелперов.
---
## 🔚 Итог:
Обновления PHP 8.0–8.3 делают ваш код:
- **чистым** и **читаемым**,
- **типобезопасным** и **предсказуемым**,
- **современным**, как и в других языках программирования.
Для интернет-магазина это значит:
- меньше багов,
- проще тестирование,
- лучше производительность,
- легче поддерживать и масштабировать.
Если вы хотите писать код как профессионалы, переходите на эти версии!
---
Если нужно, могу сделать презентацию, шпаргалку или адаптировать под конкретную CMS (например, Laravel, Symfony, Magento).