Реліз РНР 8.4: що нового

Після року кропіткої праці розробників, світ побачив реліз PHP 8.4 — версії, яка не лише суттєво розширює можливості, але й закладає фундамент для ще більш досконалої екосистеми. Хоча деякі зміни порушують сумісність із попередніми версіями, це відкриває шлях до покращення продуктивності та зручності кодування.

Що нового?

PHP 8.4 отримав новий JIT-компілятор, створений на основі IR Framework. Універсальний підхід дозволяє генерувати проміжне представлення коду, яке адаптується під будь-яку архітектуру. Це забезпечує суттєвий приріст продуктивності та робить процес виконання коду ще ефективнішим.

Обробники властивостей: код, що дихає простотою

Новий функціонал дозволяє додавати кастомну логіку для роботи з властивостями об’єктів без традиційних __get і __set. Це не лише зменшує обсяг коду, але й робить його зрозумілішим:

class User {  
    public string $name {  
        set {  
            if (strlen($value) === 0) {  
                throw new ValueError("Name must be non-empty");  
            }  
            $this->name = $value;  
        }  
    }  
    public function __construct(string $name) {  
        $this->name = $name;  
    }  
}  

Спрощення синтаксису

Забудьте про складні записи при використанні new — тепер доступний скорочений варіант:

$name = new MyClass()->method();  

«Ліниві об’єкти»

Об’єкти тепер ініціалізуються лише за потреби, оптимізуючи використання пам’яті.

Новий атрибут #[\Deprecated]

Позначайте застарілі функції разом із підказками щодо їх заміни, наприклад:

#[\Deprecated("use newFunction() instead", since: "1.1")]  
function oldFunction() {  
    // ...  
}  

Корисні новинки для масивів і часу

В оновлені також були додані пару корисних функцій для роботи з масивами та часом.

  • Функції для масивів:
    • array_find() — пошук першого елемента за умовою.
    • array_any(), array_all() — перевірка елементів на відповідність умові.
  • Робота з часом:
    • Отримання та встановлення мікросекунд (getMicrosecond(), setMicrosecond()).
    • Створення об’єкта за міткою часу (createFromTimestamp()).

Нові методи для строк і чисел

Додано функції для обрізки рядків (mb_trim()), зміни регістру символів (mb_ucfirst()), а також роботи з великими числами (bcceil(), bcround()).

Безпека на новому рівні

Оновлення ускладнило експлуатацію буферних вразливостей і посилило рандомізацію тимчасових файлів.

Що залишилося у минулому?

PHP 8.4 прощається із:

  • Константами E_STRICT, MYSQLI_REFRESH_*.
  • Деякими функціями (mysqli_ping()) і методами (mysqli::refresh()).
  • Використанням _ як імені класу.

PHP 8.4 вже готовий до роботи! Оновлюйтеся, тестуйте нові функції та діліться своїми враженнями у коментарях.

Покажіть свій найкращий код! 🔥

👍ПодобаєтьсяСподобалось12
До обраногоВ обраному1
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Об’єкти тепер ініціалізуються лише за потреби, оптимізуючи використання пам’яті.

Зі сказаного можна помилково зробити висновок наче б то внутрішня реалізація всіх обʼєктів була змінена. Але це не так. «Lazy objects» це нова фіча, яка дозволяє створювати проксі-обʼєкти з відкладеною ініціалізацією.

Мне кажется, или в JS все это уже много лет есть?)

в тайпскипті і більше є, а в js

з кожним релізом все більше люблю php

Вроде сейчас нода пыху побеждает?

вже ж не нода — тепер пайтон от от пререможе
тіки 80%+ як було сайтів в світі на РНР так і буде чи вирости )

Замість підрахунку кількості сайтів варто оцінювати їхню аудиторію, адже саме вона є ключовим показником. Cам по собі код рідко створює робочі місця.

Замість підрахунку кількості сайтів варто оцінювати їхню аудиторію

Це правильно, але як це порахувати?

Вроде сейчас нода пыху побеждает?

а в чому саме?

Много в чем, хлопці, например, Node.js позволяет использовать JavaScript как на клиенте, так и на сервере, создавая единую экосистему для разработки. Это упрощает взаимодействие между фронтенд- и бэкенд-командами. Выбор технологии всегда зависит от контекста проекта. Node.js силен в определенных типах приложений, но для задач, требующих тяжелых вычислений, Python или Go могут быть более подходящими.

Ще не доводилось бачити цієї красоти, коли фронт і бек шарять спільні компоненти. Хоч і там і там js, але здебільшого мені зустрічались кейси, коил це просто 2 додатки, які майже ніяк не пересікаються і не дають ніякої економії в розробці. Та і не кожен фронтендер захоче / зможе писати бекенд

не кожен фронтендер захоче / зможе писати
бекенд

Навпаки тєж, тільки слово «зможе» треба прибрати.

Те, що Нода почала набувати популярності — мені це відомо. Це вже тренд років мабуть з 10. Також, нібито, працює швидше.
Ще гарно на Ноді застосовувати веб-сокети.
Але пиха непереможна )
Легкість початкового входу і кількість існуючих сайтів, роблять її дуже розповсюдженою. А такі речі, як Ларавел, наприклад, та й Сімфоні (це фреймворки) роблять достатньо свіжою технологічно і потужною.
В принципі мірятися пі___ами між Нодою та Пихою немає ані сенсу, ані бажання. В обох є своє ком’юніті, маркет і перспективи.

Хлопцы, есть там шё то свежее по многопоточности? По дженерикам есть какие-то новости?

ніт
для многопоточности есть pecl.php.net/package/parallel .

Но с учётом fpm-рантайма (process per request) для cpu intensive задач особого смысла нет — другие fpm-процессы будут страдать и общий throughput сервера не улучшится. Всё тяжёлое идёт в очередь и обрабатывается в бекграунде. Это б имело смысл для io-задач, но тогда полезнее сделать асинхронность, возможно не по классике с event loop’ом, потому что это совсем другой подход и тут есть альтернативы в виде reactphp, amphp. А прилепить бы сбоку пул потоков для io задач, но видимо это тоже непросто и выглядит как костыли, хз.

Про дженерики тоже не слышно. Обсуждали насколько лет назад и разработчики ядра сказали что проверка в runtime сильно ударити по производительности, по-этому решили не делать.

Благодарю автора за статью и автора за краткий релиз и вас за ответ. А то после того как попал на 122 -ую, перестал пыху отслеживать, что там свежего, у нас тут на ней вообще никто не пишет...

А де про Asymmetric Property Visibility?

Дякую за статтю. Але не можу не запитати

Обробники властивостей: код, що дихає простотою

ви дійсно вважаете, що це зменшило складність і зробило код простим?

Мається на увазі що
1. Потім в коді який працює з такими об’єктами не буде setSomething()/getSomething() а пряма робота з пропертями (хоча тут є нюанси з легасі кодом)
2. Прибирається уродство з магією якщо не юзати п1

Тобто стає простіше не сам клас а код навколо нього.

Не бачу вигоди. Сетери/гетери очевидніші і простіше візуально читати. Почнуть мішати підходи, де буде мало коду, той може зробити в новому стилі, де коду більше, то через явний сестер, каша. Ті ж самі костилі що і з _get/_set, тільки локальніше, на рівні однієї змінної.

Сподіваюсь в code sniffer / mess detector буде нескладно додати нове правило щоб воно не пропускало такий код.

Це можна скоротити до «я звик інакше». Що звісно довод але не відповідає на питання про чистоту, зайві скобочки та префікси точно не роблять код візуально чистише. Стосовно «ті самі костилі» — теж ні, бо в __set __get у вус буде якась уродлива конструкція типу if/case/match що насправді страшне. А тут все розділено синтаксичнски.
Пс. Я теж до цього буду звикати мабуть довго, але воно того варте, особливо коли то набере широкого вжитку

але воно того варте

Ну рeльно нeма плюсiв порiвняно з гeтeрами/сeтeрами (окрeмими мeтодами, нe __get/__set). Алe добрe, eмоцiї стихли, най будe :)
Щоб було мeньшe boilerplate коду i трохи схожe на с# . Та i раз в java часто Lombok використовують i додали record, то мабуть дiйcно має сeнс.

Підписатись на коментарі