Всем привет!

Это дайджест новостей от CutCode. Давайте посмотрим, что произошло за прошедший месяц в мире PHP и Laravel.

Новости PHP

Релизы PHP 8.3.21 и PHP 8.4.7

Выпуски с исправлением ошибок вышли по расписанию.

Random Beer

В опросе PHP-сообщества 2024 многие отмечали, что нам не хватает нетворкинга, развлечений и неформальных мероприятий. И мне есть что вам предложить – состоялось уже три встречи в онлайн-баре «PHPерделка».
Присоединяйтесь, будет интересно и познавательно ?

Пых.конф

19 сентября в Москве в Центре Международной Торговли пройдёт новая PHP-конференция – Пых.конф’25!

400 участников • 4 зала • 28 докладов Вот сайт конференции, где можно приобрести билет - https://conf.phpyh.ru/.

Там же можно записаться в качестве спикера и предложить доклад! Заявку можно подать до 1 июля.

FrankenPHP теперь официально поддерживается PHP Foundation

Репозиторий FrankenPHP в ближайшее время будет перенесен в организацию PHP на GitHub.

Руководство проектом остается неизменным, и текущая команда мейнтейнеров (Кевин Данглас, Роберт Ландерс, Александр Штехер) продолжит отвечать за выпуски, а также за code review. Они будут активно сотрудничать с командой PHP Foundation, отвечающей за разработку языка.

В будущем сервер может войти в состав PHP по аналогии с PHP-FPM, если такой RFC пройдёт голосование.

Программа раннего доступа PhpStorm 2025.2

С помощью программы раннего доступа вы можете попробовать новые возможности PhpStorm и оставить свой отзыв команде PhpStorm. Сборки по программе раннего доступа бесплатны для использования и не требуют лицензии.

Новости ядра PHP

Большинство новостей ядра PHP подробно освещаются в серии PHP Core Roundup от PHP Foundation, мы лишь быстро по ним пробежимся:

RFC: array_first() and array_last()

В PHP 7.3 появились функции array_key_first() и array_key_last() для получения первого и последнего ключа массива, но до сих пор нет функций для получения первого и последнего значения массива.

Сергей Мухин в своем телеграм-канале вспомнил, что в PHP 7.3 функции для получения значений так же были в RFC, но они не прошли голосование в отличие от функций для получения ключей массивов.

И вот, спустя 7 лет, в PHP 8.5 появятся функции array_first() и array_last() для получения первого и последнего значения массива.

? RFC: Clone with v2

В 2022 году Máté Kocsis представил RFC Clone with, который не дошел до стадии голосования.

В этом году Volker Dusch и Tim Düsterhus решили подхватить работу над заброшенной реализацией и представили вторую версию RFC.

? RFC: Pipe operator v3

С третьей попытки оператор конвейера попадет в PHP. Первая попытка была предпринята Sara Golemon и Marcelo Camargo в далеком 2016 году, но RFC так и не дошел до голосования.

Спустя 4 года в 2020 Larry Garfield предпринял вторую попытку, но несмотря на то, что RFC нашел отклик у сообщества на сайте RFC Vote, на голосовании большинство отдало свой голос против инициативы, потому что реализация была шаткая и близился фича-фриз PHP 8.1.

Спустя еще почти 5 лет Larry Garfield снова начал дискуссию об операторе конвейера, улучшив реализацию, которая преодолела порог в ⅔ голосов и была принята.

PHP 30 лет

В этом году PHP исполнилось 30 лет, за это время проект вырос из набора скриптов для домашних страниц до языка программирования на котором работает 80% сайтов.

Кажется, что современный PHP уже перерос Personal Home Page Tools и пора подумать над новым значением акронима. Вы прислали варианты акронима, а также истории, как вы впервые столкнулись с PHP, как язык повлиял на вашу жизнь или почему вы считаете PHP классным. Собрали их тут:

https://php30.ru

А также обсудили их в эфире:

А 5 разработчиков стали счастливее благодаря PHP-слоникам! ?

Обновления Laravel

[12.11] Typed getters for Arr helper

https://github.com/laravel/framework/pull/55567

Anthony Tibbs добавил типизированные методы-геттеры в хелпер Arr (Arr::string(), Arr::integer(), Arr::float(), Arr::boolean(), Arr::array()).Каждый метод попытается вернуть тип и выдаст исключение, если данные не соответствуют типам:

use Illuminate\Support\Arr;

$array = ['name' => 'Joe', 'languages' => ['PHP', 'Ruby']];

$value = Arr::string($array, 'name');

// Joe

$value = Arr::string($array, 'languages');

// throws InvalidArgumentException

[12.11] Add payload creation and original delay info to job payload

https://github.com/laravel/framework/pull/55529

Следующий PR от Taylor Otwell. Видимо он готовится к релизу Laravel Nightwatch, прокачал payload в jobs - добавились delay и createdAt.

$job->payload();

/*

Возвращает: ['delay' => 5, 'createdAt' => 1745965273]

*/

[12.12] Make Blueprint Resolver Statically

https://github.com/laravel/framework/pull/55607

В Laravel обнаружили баг: Schema::blueprintResolver() не работал глобально из-за отсутствия static у резолвера. Изначально проблему попытались исправить, но после обсуждения Taylor Otwell решил откатить изменения, чтобы избежать побочных эффектов.

Временное решение:

$this->callAfterResolving('db.schema', fn ($schema) => $schema->blueprintResolver(/* ... */));

Обновление появится в следующих версиях Laravel.

[12.13] Allow naming queued closures

https://github.com/laravel/framework/pull/55634

Will Rowe добавил возможность назначать имена замыканиям (Closure) при постановке в очередь. Это упрощает идентификацию и управление задачами в очередях и системах мониторинга.

dispatch(function () {

    // ...

})->name('custom_name');

[12.13] Add support for callback evaluation in containsOneItem method 

https://github.com/laravel/framework/pull/55622

Теперь метод containsOneItem() коллекций поддерживает передачу замыкания (Closure), что позволяет использовать собственную логику для проверки условий. Метод вернет true, если ровно один элемент коллекции удовлетворяет условию.

$collection = collect([1, 2, 3]);

$collection->containsOneItem(fn($item) => $item === 2); // true

$collection->containsOneItem(fn($item) => $item > 1);   // false (2 и 3 соответствуют условию)

[12.14] Revert Make Blueprint Resolver Statically

https://github.com/laravel/framework/pull/55690

Taylor Otwell откатил изменения по Blueprint, которые были внесены релизом 12.12. После выхода версии 12.13 обнаружился критический баг.

[12.14] Introduce Arr::from()

https://github.com/laravel/framework/pull/55715

Helper по работе с массивами, новый метод Arr::from() позволяет легко преобразовывать различные типы данных в массивы:

use Illuminate\Support\Arr;

// Примеры использования:

Arr::from(collect(['name' => 'Laravel'])); // ['name' => 'Laravel']

Arr::from($jsonable); // Декодирует данные объекта Jsonable в массив

Arr::from($arrayable); // Возвращает массив через метод объекта toArray()

[12.15] Add locale-aware number parsing methods to Number class

https://github.com/laravel/framework/pull/55725

Mbungu Ngoma добавил три метода в класс Number для парсинга локализованных числовых строк в числовые значения. Методы используют класс NumberFormatter для разбора и определения формата:

use Illuminate\Support\Number;

// Базовые методы

Number::parse($string);          // Автоматическое определение типа

Number::parseInt($string);       // Строго целое число

Number::parseFloat($string);     // Строго число с плавающей точкой

// С указанием локали

Number::parseFloat(string: $string, locale: 'de');

// Расширенный вариант с указанием типа

Number::parse(

    string: $string,

    type: NumberFormatter::TYPE_INT64,

    locale: 'de',

);

[12.15] Add a default option when retrieving an enum from data

https://github.com/laravel/framework/pull/55735

Теперь метод enum() в трейте InteractsWithData поддерживает значение по умолчанию, его добавили третьим параметром.

Было:
$chartType = request()->enum('chart_type', ChartTypeEnum::class) ?: ChartTypeEnum::Bar;

Стало:
$chartType = request()->enum('chart_type', ChartTypeEnum::class, ChartTypeEnum::Bar);

[12.15] Add hash string helper

https://github.com/laravel/framework/pull/55767

В хелперы по работе со строками, добавили метод hash() который позволяет хешировать на основе дефолтного алгоритма.

$appId = str('secret-unique-key')
    ->hash('xxh3')  // Простое хеширование
    ->take(10)      // Берем первые 10 символов
    ->prepend('app-'); // Добавляем префикс

// Результат: app-0fb8aac18c

//Как было раньше (до Laravel 12.15):

$appId = str('secret-unique-key')
    ->pipe(fn(Stringable $str) => hash('xxh3', (string) $str)) // Громоздкий вариант
    ->take(10)
    ->prepend('app-');

[12.15] feat: Add current_page_url to Paginator

https://github.com/laravel/framework/pull/55789

В PR изменили структуру Paginator - добавилась ссылка на текущую страницу. Интересно, что в комментариях Taylor Otwell уже намекнули на возможные проблемы с этим изменением — пока он не отреагировал, но не исключено, что через пару релизов сделают revert.

class ApiResourceCollection extends AnonymousResourceCollection

{
    public function paginationInformation(Request $request, array $paginated, array $default): array
    {
        return [
            'links' => [
                'self' => $paginated['current_page_url'],
                'next' => $paginated['next_page_url'] ?? null,
            ],
        ];
    }
}

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

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