Всем привет!

Это 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(), чтобы предоставить простой способ определить количество доступных процессоров для оптимизации параллельных задач, особенно в многопоточных или асинхронных скриптах.

? RFC: str_icontains

В 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() и т. д.).

? RFC: Drop 32-bit Builds

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
{
    // ...
}

Видео версия дайджеста:

Комментарии (0)