Всем привет!
Это PHP Дайджест на канале CutCode. Давайте посмотрим, что произошло за прошедший месяц в мире PHP.
Новости PHP
PHP исполнилось 30 лет!
8 июня 1995 года Rasmus Lerdorf впервые объявил о PHP.
В течение трех десятилетий PHP был локомотивом интернета, превратившись в динамичный и мощный язык, который все мы сегодня знаем и любим. Чтобы отметить эту веху, команда JetBrains собрала вместе блестящие умы на PHPVerse 2025, которые сформировали прошлое, настоящее и будущее PHP.
Посмотрите запись трансляции на YouTube, если пропустили.
Мы тоже решили не отставать и провели собственный стрим, где почитали истории о том, как разные разработчики приобщались к PHP, поностальгировали, и, конечно же, разыграли PHP-слоников, куда же без них.
Переходите на сайт PHP 30, чтобы почитать истории других разработчиков, а также присылайте пул-реквесты со своими историями.
С днем рождения, PHP! ???
Релизы PHP 8.3.22 и PHP 8.4.8
Выпуски с исправлением ошибок вышли по расписанию.
Пых.конф
19 сентября в Москве в Центре Международной Торговли пройдёт новая PHP-конференция – Пых.конф’25! В программе заявлено 28 докладов, вот некоторые из них:
Кирилл Несмеянов покажет, как писать десктопные приложения на PHP на Boson
Андрей Клименко (HappyJob) вскружит голову функциональным программированием
Александр Макаров (Twindo) расскажет про внутрянку Yii3
Дмитрий Edmond поделится прогрессом RFC True Async
Вадим Занфир (VK) научит имплементировать на PHP любые протоколы в неблокирующем стиле,
Олег Мифле (Altenar) объяснит, зачем в PHP мьютексы
Алексей Солодкий (BelkaCar) поможет оптимизировать воркеры
Павел Иванов (HappyJob) обезопасит ваши Docker-образы
Александр Чередников (QTIM) построит для вас RAG-систему на PHP
Илья Рупасов (Битрикс) препарирует фреймворки тестирования
Переходите на сайт конференции и успейте купить билет по выгодным ценам.
Быстрый старт c Temporal
Павел Бучнев и Алексей Гагарин показали как начать работать с Temporal. Если кто-то давно уже планировал начать работать со Spiral, Temporal и RoadRunner, но не знал с какой стороны к этому всему подступиться, посмотрите обязательно запись стрима на YouTube.
Пыхап #4 × Lamoda Tech
Состоялся уже четвертый Пыхап! Олег Мифле научил держать руку на пульсе прода при помощи логов, метрик и трейсинга, Фёдор Кулаков провёл в недра PHP, чтобы показать, как за минуту получить одинаковые "рандомные" значения, а Валентин Удальцов показал, как эффективно отправлять сообщения, сохранённые вместе со стейтом.
Все, кто не смог лично посетить мероприятие, могут посмотреть в записи на YouTube или VK Видео.
Кстати, Пых-слоны уже почти готовы ?
Обновления ядра PHP
Большинство новостей ядра PHP подробно освещаются в серии PHP Core Roundup от PHP Foundation, мы лишь быстро по ним пробежимся:
✅ RFC: Clone with v2
В 2022 году Máté Kocsis представил RFC Clone with, который не дошел до стадии голосования.
В этом году Volker Dusch и Tim Düsterhus решили подхватить работу над заброшенной реализацией и представили вторую версию RFC, которая была принята.
? RFC: Single-Expression functions
Дмитрий Дерерко предложил синтаксис для объявления функций и методов с одним выражением в теле. Новый синтаксис упрощает написание лаконичных функций, улучшая читаемость и сокращая объем кода.
? RFC: num_available_processors
Знание количества ядер процессора может быть полезным в различных приложениях.
Daniel Kesselberg предлагает добавить функцию num_available_processors(), чтобы предоставить простой способ определить количество доступных процессоров для оптимизации параллельных задач, особенно в многопоточных или асинхронных скриптах.
В PHP 8.0 появилась функция str_contains(), которая обеспечивает ясный и лаконичный способ определения, содержит ли строка заданную подстроку.
Adam Cable предлагает добавить функцию str_icontains(), которая будет выполнять такую же проверку, но без учета регистра.
? RFC: #[\DelayedTargetValidation] attribute
Daniel Scherzer предлагает добавить атрибут #[\DelayedTargetValidation], который откладывает проверку допустимости целей атрибута до момента его использования, а не во время загрузки класса, что позволит писать более гибкие и переиспользуемые атрибуты, особенно в случаях, когда логика применения атрибута зависит от контекста, известного только во время выполнения.
? RFC: Add RFC 4648 compliant data encoding API
Ignace Nyamagana Butera предлагает добавить новый объектно-ориентированный API для кодирования и декодирования данных в base64, base64url и hex форматах, с помощью класса Encoding, чтобы предоставить централизованный, чистый и расширяемый способ работы с различными схемами кодирования, в отличие от текущих разрозненных функций (base64_encode(), bin2hex() и т. д.).
Marc Bennewitz для упрощения разработки, тестирования и проблемы 2038 года предлагает прекратить поддержку 32-битных сборок в следующем младшем релизе и полностью отказаться от поддержки 32-битных сборок в следующем крупном релизе.
Начиная с PHP 9.0, больше не будет возможности собирать или запускать PHP в 32-битных средах.
? RFC: Object-oriented curl API v2
Eric Norris предлагает добавить объектно-ориентированный API для работы с cURL, параллельно с существующим процедурным API.
В прошлом году Sara Golemon так же предлагала подобное улучшение, но RFC так и не дошел до стадии голосования.
? RFC: Partial Function Application (v2)
Larry Garfield и Arnaud Le Blanc предлагают добавить частичное применение функций с помощью оператора ... (многоточие).
Это позволит фиксировать часть аргументов функции заранее, создавая новую функцию с меньшим числом параметров.
Используется оператор ... (многоточие) для обозначения аргументов, которые остаются незаполненными.
function add($a, $b) { return $a + $b; }
$addFive = add(5, ...);
echo $addFive(10); // 15
Обновления Laravel
[12.16] Add in_array_keys validation rule to check for presence of specified array keys
https://github.com/laravel/framework/pull/55807
PR от Steve Bauman (который следит за всеми перспективными новинками и недавно поддержал постом Boson PHP).
Раньше, если нужно было проверить, что массив содержит хотя бы один из указанных ключей, приходилось писать кастомное правило или использовать сторонние пакеты. Теперь появилась встроенная валидация in_array_keys
, которая делает этот процесс гораздо проще и безопаснее, особенно при работе с API и конфигурациями.
$validator = Validator::make($request->all(), [
'config' => 'array|in_array_keys:api_key,access_token,oauth_token',
'config.api_key' => 'nullable|string|min:32|max:64',
'config.access_token' => 'nullable|string|min:40',
'config.oauth_token' => 'nullable|string|starts_with:oauth_',
]);
[12.16] Add Rule::contains
https://github.com/laravel/framework/pull/55809
Теперь можно удобно проверять, что массив содержит хотя бы одно из указанных значений, используя флюентный метод Rule::contains
. Раньше приходилось использовать строки с implode, что было не так удобно и поддерживало только строковые значения. Теперь можно передавать любые типы данных, включая объекты и enum. В документации Laravel уже появились примеры использования этого метода
use Illuminate\Validation\Rule;
Validator::make($request->all(), [
'roles' => [
'required',
'array',
Rule::contains([Role::Admin, Role::Editor]),
],
]);
[12.16] Introducing Arr::hasAll
https://github.com/laravel/framework/pull/55815
Новый метод Arr::hasAll
позволяет легко проверить наличие всех указанных ключей в массиве, включая вложенные через dot-нотацию. Теперь не нужно писать дополнительные проверки для вложенных массивов.
use Illuminate\Support\Arr;
$user = [
'name' => 'Taylor',
'language' => 'php'
];
Arr::hasAll($user, ['name']); // true
Arr::hasAll($user, ['name', 'language']); // true
Arr::hasAll($user, ['name', 'ide']); // false
[12.16] Introducing toUri to the Stringable Class
https://github.com/laravel/framework/pull/55862
Теперь можно преобразовать строку в объект URI прямо в цепочке методов, что удобно для динамической генерации ссылок и параметров запроса. Теперь можно легко добавлять параметры запроса и работать с URI как с объектом.
$sentence = 'Go to {https://euhosting.com/support} for support.';
$uri = str($sentence)->between('{', '}')->toUri();
if (auth()->user()->isVip()) {
$uri = $uri->withQuery(['customer' => auth()->user()->publicId()])
->withQuery(['priority' => 'emergency']);
}
return $uri->value();
[12.17] Add AsUri model cast
https://github.com/laravel/framework/pull/55909
Теперь можно использовать каст AsUri
, чтобы автоматически преобразовывать строку из базы данных в объект URI и обратно. Это особенно полезно для проектов, где часто работают с ссылками: короткие URL, редиректы, логирование переходов. Теперь не нужно вручную преобразовывать строки в объекты и обратно.
use Illuminate\Database\Eloquent\Casts\AsUri;
class Website extends Model
{
protected $casts = [
'homepage' => AsUri::class,
];
}
// Использование
$website = Website::create(['homepage' => 'https://example.com']);
$uri = $website->homepage; // Returns a proper URI object
[12.17] feat: Add Contextual Implementation/Interface Binding via PHP8 Attribute
https://github.com/laravel/framework/pull/55904
Новый атрибут Give
позволяет указывать реализацию интерфейса прямо в конструкторе класса, что уменьшает количество бойлерплейта в сервис-провайдерах.
Теперь не нужно описывать биндинги в провайдерах для каждого случая — достаточно указать атрибут.
use Illuminate\Container\Attribute\Give;
class UserController extends Controller
{
public function __construct(
#[Give(DatabaseUserRepository::class)]
private UserRepositoryInterface $userRepository
) {}
}
class OrderService
{
public function __construct(
#[Give(StripePaymentProcessor::class)]
private PaymentProcessorInterface $processor
) {}
}
[12.18] Add encrypt and decrypt Str helper methods
https://github.com/laravel/framework/pull/55931
Теперь можно шифровать и расшифровывать строки прямо в цепочке методов, что упрощает работу с чувствительными данными. Теперь не нужно использовать дополнительные методы или пайпы для шифрования и расшифровки строк.
$encryptedToken = str('secret-api-token')
->encrypt()
->prepend('encrypted:')
->append(':end');
$decryptedToken = str($encryptedToken)
->after('encrypted:')
->before(':end')
->decrypt();
[12.18] feat: create UsePolicy attribute
https://github.com/laravel/framework/pull/55882
Новый атрибут UsePolicy
позволяет автоматически связывать модель с политикой, что упрощает регистрацию политик и делает код чище.
use Illuminate\Foundation\Auth\Access\UsePolicy;
#[UsePolicy(PostPolicy::class)]
class Post
{
// ...
}
[12.19]: Add UseEloquentBuilder attribute to register custom Eloquent Builder
https://github.com/laravel/framework/pull/56025
Теперь можно указывать собственный билдер для Eloquent модели через атрибут, что упрощает работу с кастомными запросами.
use Illuminate\Database\Eloquent\Attributes\UseEloquentBuilder;
#[UseEloquentBuilder(CustomBuilder::class)]
class MyModel extends Model
{
// ...
}
Видео версия дайджеста: