Всем привет!

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

Новости PHP

Первые бета-версии PHP 8.4 доступны для тестирования

Вышли первые две бета-версии PHP 8.4.

Заморозка функций состоялась 13 августа, а это значит, что все RFC, которые еще не завершили голосование, будут нацелены уже на следующую версию PHP.

Перед финальным выпуском, который ожидается 21 ноября, нас ожидает еще 1 бета-версия и 4 релиз-кандидата.

Вышли PHP 8.2.23 и PHP 8.3.11

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

The State of Laravel Survey 2024

Tobias Petry запустил ежегодный опрос о состоянии сообщества Laravel. На сайте также доступны прошлогодние результаты опроса.

State of Generics and Collections

Arnaud Le Blanc, Derick Rethans и Larry Garfield рассказали о текущем состоянии дженериков в PHP.

Вы можете принять участие в обсуждении в списке рассылок и на Reddit.

Вышел PhpStorm 2024.2

В этой версии вас ждет поддержка лог-файлов, редактирование из плавающей панели инструментов, автодополнение в новом терминале, улучшенное автодополнение строки целиком и многое другое.

С полным списком изменений можно ознакомиться на сайте JetBrains.

Podlodka PHP Crew

С 30 сентября по 4 октября пройдет Podlodka PHP Crew – недельная конференция с экспертами из топовых компаний.

Вас ждут сессии в Zoom, сообщество в Telegram и ламповая атмосфера.

PHP Russia 2024

2 и 3 декабря в Москве пройдёт конференция Highload, в рамках которой 16 докладов будут выделены под PHP Russia. 

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

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

❌ RFC: Static class

RFC не набрал необходимый процент голосов и был отклонен.

✅RFC: Lazy Objects

В PHP 8.4 появятся ленивые объекты. Эти объекты будут инициализироваться и потреблять ресурсы только при чтении или изменении свойства.

Хотя ленивые объекты не будут использоваться непосредственно большинством пользователей, они предназначены в первую очередь для авторов библиотек и фреймворков, позволяя им удалить большое количество шаблонного кода.

?RFC: Improve language coherence for the behaviour of offsets and containers

PHP поддерживает доступ к элементам контейнера смещением с помощью скобок [] со следующей нотацией $container[$offset]. Однако поведение таких обращений зависит не только от типа контейнера и смещения, но и от операции, которая выполняется при обращении к смещению. Существующее поведение крайне непоследовательно и трудно предсказуемо.

Gina Peter Banyard предлагает улучшить согласованность языка для смещений и контейнеров.

✅RFC: Add bcdivmod to BCMath

В настоящее время в PHP есть функция bcdiv() для деления чисел произвольной точности и функция bcmod() для получения остатка после деления.

В PHP 8.4 появится новая функция bcdivmod(), которая позволит получить частное и остаток за одну операцию в виде массива.

✅RFC: Property hook improvements

После внедрения хуков свойств, Ilija Tovilo и Larry Garfield нашли способ реорганизовать логику, чтобы увеличить производительность. RFC прошел стадию голосования и мы получим улучшения хуков уже в PHP 8.4.

✅RFC: Asymmetric Visibility v2

Со второй попытки RFC был принят. Синтаксис, подобный Swift, позволяющий свойствам иметь отдельную («асимметричную») видимость для операций чтения и записи появится в PHP 8.4.

? RFC: Function Autoloading v4

Используя автозагрузчики (например, composer), пользователи уже могут быстро освоиться с классами, но в настоящее время в языке нет возможности сделать то же самое с функциями. Robert Landers предложил добавить возможность автозагрузки функций.

? RFC: Should PHP have a directive that makes the parser treat all namespaced function calls as global?

При вызове функций из глобального пространства имен парсер PHP создает опкоды, которые используют эти функции напрямую. Парсер может использовать специальные опкоды, оптимизированные для вызова определенных встроенных функций.

Nick Lockheart призывает обсудить вопрос о том, должна ли в PHP быть директива, которая заставляет парсер рассматривать все вызовы функций из пространства имен как глобальные.

? RFC: Default expression

Единственный способ передать значение по умолчанию параметру функции или метода – не передавать ничего. Paul Morris предлагает ввести выражение default в контекстах передачи аргументов, чтобы использовать значение по умолчанию функции или метода.

function greetingEveryone($greeting = 'Hello', $subject = 'World') {
    return sprintf('%s, %s!', $greeting, $subject);
}

var_dump(greetingEveryone(default, default)); // Hello, World!

Laravel дайджест

Обновления Laravel

11.19. Add whereNone method to the query builder

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

PR, который затрагивает QueryBuilder. Добавлен новый метод whereNone. Ранее у нас уже были методы whereAny и whereAll, и теперь появился еще и whereNone. Если мы взглянем на изменения, то увидим, что в целом под капотом мы используем тот же самый метод whereAny, но добавляем к переменной логическое отрицание. Далее возвращаемся к примеру: видим, что у нас есть набор полей, оператор, значения, и итоговая конструкция, которая сгруппирована в конструкцию NOT.

$users = DB::table('users')
            ->where('active', true)
            ->whereNone([
                'first_name',
                'last_name',
                'email',
            ], 'LIKE', 'einar%')
            ->get();
SELECT *
FROM users
WHERE active = true AND NOT (
    first_name LIKE 'einar%' OR
    last_name LIKE 'einar%' OR
    email LIKE 'einar%'
)

11.19. assertSeeHtml, assertDontSeeHtml and assertSeeHtmlInOrder testing methods

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

PR, который затрагивает тесты и добавляет новые методы. Автор PR указывает на то, что при тестировании LiveWire компонентов есть методы assertSeeHtml и другие. Он был удивлен, что в самом трейте Laravel по тестированию этих методов не было. На самом деле их не было, потому что для воспроизведения этих методов достаточно было использовать assertSee с вторым параметром, указывающим, что Escape равен false. Поэтому, я думаю, никто не нуждался в таком сахаре, но теперь он есть, и параметр Escape false будет установлен за вас автоматически. 

$response->assertSeeHtml('<li>foo</li>');
$response->assertSeeHtmlInOrder(['<li>foo</li>', '<li>bar</li>', '<li>baz</li>']);
$response->assertDontSeeHtml('<li>foo</li>');

В итоге мы сможем тестировать HTML без экранирования и без нескольких лишних символов кода.

11.19. Add assertExactJsonStructure method

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

Следующий PR также затрагивает тесты. На этот раз речь идет о тестировании API-ответов, и мы проверяем, точно ли структура JSON соответствует той, которую мы указали. То есть мы проверяем только структуру без значений. 

{
    "data": {
        "id": 1,
        "firstname": "Taylor",
        "lastname": "Otwell"
    }
}

В данном случае в примере мы видим, что у нас есть такой JSON: id, firstname, lastname

Подобный тест будет провален, так как мы не указали, что в структуре также присутствует ID.

// This fails
$response->assertExactJsonStructure([
    'data' => [
        'firstname',
        'lastname',
    ],
]);

После указания этого параметра, тест станет зеленым.

// This succeeds
$response->assertExactJsonStructure([
    'data' => [
        'id',
        'firstname',
        'lastname',
    ],
]);

11.19. Add withoutHeader() test method

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

Всё еще тесты, работа с request. До этого у нас был метод withHeader, чтобы добавить определенные заголовки.

$this->withHeader('Foo', 'bar')->get(...);

Но так вышло, что не было withoutHeader. Теперь есть, этот PR закрывает данную задачу.

$this->withoutHeader('Foo')->get(...);

11.20. Add collapseWithKeys to Collection

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

PR затрагивает коллекции и добавляет новый метод collapseWithKeys. До этого у нас были методы flatten и collapse, которые справлялись со своей задачей, но при этом не сохраняли ключи. Теперь же этот метод будет выполнять то же самое, но при этом ключи будут сохраняться. Как видим из примера, массив (коллекция) до и результат после применения метода, при этом ключи у нас сохраняются.

[[1 => 'a'], [3 => 'c'], [2 => 'b']] // before
[1 => 'a', 3 => 'c', 2 => 'b']       // after

11.20. Add deduplicate to strings

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

Pull request затрагивает хелперы по работе со строками и добавляет новый метод deduplicate. В пул-реквесте изначально он назывался didup, но в итоге был переименован в deduplicate. Это очень полезный хелпер-метод, я точно буду его использовать. Он исключает из указанной строки дубликаты. Указываем, какой символ мы ищем на предмет дубликатов, и если он встречается больше чем один раз, то все дубли будут удалены. 

Пример - если есть в строке несколько двойных слэшей подряд, то будет оставлен только один:

Str::dedup('/some//odd/path//', '/'); // '/some/odd/path/'
Str::dedup('zondaaaa', 'a');          // 'zonda'

11.20. Introduce MixFileNotFoundException for handling missing Mix files

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

Если у нас отсутствуют mix-файлы, то появилось новое исключение на этот случай — MixFileNotFoundException. На мой взгляд, это лучше, чем runtime.exception.

11.20. Create Notification make command markdown name placeholder from Notif…

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

Консольная команда по созданию Notification получила несколько новых интерактивных input. С вопросом, нужно ли создать view для markdown, и соответственно, как это view будет называться.

11.20. feat: make Facade::isFake() public 

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

Фасады могут быть фейковыми, но при этом внутри фасада был метод из fake, который был protected. Теперь он у нас public, и мы можем проверять, находится ли фасад в состоянии фейка или нет.

11.21. Eager asset prefetching strategies for Vite

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

Апдейт в рамках релиза 11.21 от Tim MacDonald. PR затрагивает фасад Vite и влияет на prefetch-стратегию наших ассетов. По умолчанию Vite в Laravel подключает просто ассеты CSS и JS, объявленные целиком. Tim MacDonald добавил две новые стратегии prefetch: Waterfall и агрессивную. 

Если посмотреть на изменения, то увидим в Vite-фасаде новые методы. Сам вывод ассетов в HTML раньше был в одну строчку, теперь нас ждет огромная логика, где мы не просто берем объявленные ассеты, а берем именно чанки из манифеста. Vite как раз умеет делать код-сплитинг: разбивать все на отдельные компоненты, мы по ним проходимся и вешаем на них prefetch, добавляем JS о том, как мы будем постепенно загружать эти ассеты с указанием количества конкурентных запросов и так далее. В общем, очень интересный PR и в целом в описании мы видим очень много информации об этом, как выглядит та же самая подгрузка ассетов в Tailwind, когда мы прокручиваем меню. Делаем hover по A-link и постепенно догружаем ассеты. Такая стратегия отлично подойдёт для статических сайтов.

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

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


  1. Forum3
    01.10.2024 08:10
    +1

    Спасибо за дайджест. На плюсик кармы не хватает.


    1. Cutcode Автор
      01.10.2024 08:10
      +1

      спасибо за поддержку! карма - дело наживное