Всем привет!
Это дайджест новостей от 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() для получения первого и последнего значения массива.
В 2022 году Máté Kocsis представил RFC Clone with, который не дошел до стадии голосования.
В этом году Volker Dusch и Tim Düsterhus решили подхватить работу над заброшенной реализацией и представили вторую версию RFC.
С третьей попытки оператор конвейера попадет в 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 классным. Собрали их тут:
А также обсудили их в эфире:
А 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,
],
];
}
}
Видео версия дайджеста: