The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Релиз языка программирования PHP 8.4

21.11.2024 13:04

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

Ключевые изменения в PHP 8.4:

  • Предложена новая реализация JIT-компилятора, построенная на базе IR Framework. Ключевое отличие в том, что старый JIT напрямую генерировал машинные инструкции на основе байткода и с использованием разных бэкендов для архитектур x86_64 и AArch64, а новый JIT использует единый для всех архитектур бэкенд и генерирует промежуточное представление (IR), которое затем дополнительно оптимизируется и преобразуется в машинные инструкции для нужной целевой платформы.
  • Добавлена поддержка прикрепления обработчиков свойств (property hook), позволяющих добавить дополнительную логику, выполняемую при изменении или доступе к свойствам объекта, реализуемую без перехвата операций чтения и записи при помощи общих функций __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()" теперь можно указывать "$name = new MyClass()->method()".
  • Добавлена возможность асимметричного управления видимостью свойств объектов (public, private, protected), отдельно для операций записи (set) и чтения (get). Например:
    
       class PhpVersion
       {
           public private(set) string $version = '8.4';
       }
    
       $phpVersion = new PhpVersion();
       var_dump($phpVersion->version); // string(3) "8.4"
       $phpVersion->version = 'PHP 8.3'; // error
    
  • Предоставлена штатная поддержка "ленивых" объектов (lazy), инициализация которых производится в момент первого использования.
  • Вместо общего параметра "opcache.jit_buffer_size" для управления JIT-компилятором и настройки размера буфера JIT предложены параметры "opcache.jit" и "opcache.jit_buffer_size". Для отключения JIT теперь можно указывать "opcache.jit=disable" вместо "opcache.jit_buffer_size=0". Внесены изменения, снижающие потребление памяти и повышающие производительность JIT в некоторых ситуациях.
  • Добавлен атрибут "#[\Deprecated]", предназначенный для пометки устаревших функций, классов и методов.
    
       #[\Deprecated("use newFunction() instead", since: "1.1")]
       function oldFunction() {
           // …
       }
    
  • Реализован класс \Dom\HTMLDocument, поддерживающий корректный разбор разметки HTML5.
  • Добавлена функция request_parse_body() для разбора HTTP-запросов с типом контента multipart/form-data (RFC1867).
  • Добавлены функции array_find(), array_find_key(), array_any() и array_all(). Функции array_find() и array_find_key() возвращают первый элемент или ключ в массиве, для которых сработала проверка, заданная через указанную пользователем callback-функцию. В свою очередь функции array_any() и array_all() возвращают любой совпавший элемент и все совпавшие элементы. Например, для вывода первого элемента, размер поля title в котором больше 5 символов, можно указать:
    
       $firstMatch = array_find(
           $posts, 
           function (Post $post) {
               return strlen($post->title) > 5; 
           }
       );
    
  • Добавлены методы DateTime::getMicrosecond() и DateTimeImmutable::setMicrosecond($microsecond) для получения и установки времени с микросекундной точностью, а также метод DateTime::createFromTimestamp().
  • В PDO (PHP Data Objects), абстрактный интерфейс для работы с базами данных, добавлена возможность создания парсеров SQL и субклассов, специфичных для определённых драйверов СУБД. Добавлены новые субклассы Pdo\Dblib, Pdo\Firebird, Pdo\MySql, Pdo\Odbc и Pdo\Sqlite.
  • Добавлены новые функции mb_trim(), mb_ltrim(), mb_rtrim(), mb_ucfirst(), mb_lcfirst(), bcceil(), bcdivmod(), bcfloor() и bcround(), pcntl_getcpu(), pcntl_getcpuaffinity(), pcntl_getqos_class(), pcntl_setns(), pcntl_waitid(), http_get_last_response_headers(), http_clear_last_response_headers(), fpow()
  • Операции exit и die теперь можно вызывать в форме полноценных функций, которые допускается передавать в качестве аргумента в другие функции. Ранее возможности функций exit() и die() были сильно ограничены, так как они представляли собой обвязки над ключевыми словами exit и die.
  • Добавлены изменения, усложняющие эксплуатацию уязвимостей, вызванных выходом за границы буфера, а также усиливающие рандомизацию имён файлов, создаваемых через функцию tempnam().
  • Объявлено устаревшим поведение, при котором для параметров функций с присвоенным по умолчанию значением null автоматически разрешалось присвоение значений null. Для того, чтобы подобные параметры могли принимать значения null теперь требуется явное указание префикса "?". Например, вместо "function save(Book $book = null) {}" следует указывать "function save(?Book $book = null) {}".
  • Объявлены устаревшими константы E_STRICT, MYSQLI_REFRESH_*, функции mysqli_ping(), mysqli_kill(), mysqli_refresh(), методы mysqli::ping(), mysqli::kill(), mysqli::refresh(), возможность использования "_" в качестве имени класса, некоторые свойства DOMDocument и DOMEntity. Запрещено переопределение констант класса GMP, для которого теперь выставлено ключевое слово "final".

Дополнительно, можно отметить выпуск статического анализатора PHPStan 2.0, позволяющего находить ошибки в коде на языке PHP без его выполнения и использования unit-тестов. Анализатор предоставляет 10 уровней, охватывающих такие области, как выявление неопределённых переменных, неизвестных классов, функций и методов; проверка типов аргументов и возвращаемых значений; корректность использования некоторых типов; определение никогда не вызываемого кода. Код проекта написан на языке PHP и распространяется под лицензией MIT.

  1. Главная ссылка к новости (https://www.php.net/archive/20...)
  2. OpenNews: Релиз языка программирования PHP 8.3
  3. OpenNews: Уязвимость в PHP, позволяющая выполнить код при работе в режиме CGI
  4. OpenNews: Уязвимость в Glibc, эксплуатируемая через скрипты на PHP
  5. OpenNews: Предварительный выпуск проекта PXP, развивающего расширенный диалект языка PHP
  6. OpenNews: Выпуск PHPStan 1.0, статического анализатора для кода на языке PHP
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/62269-php
Ключевые слова: php
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (42) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.5, ijuij (?), 13:32, 21/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Чем-то он уже напоминает C#.
     
     
  • 2.9, _kp (ok), 13:45, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Слишком много денежного фетишизма в синтаксисе языка.
    Еще убрать немного лишнего, и будет красиво.
     
     
  • 3.12, Аноним (12), 14:07, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +3 +/
    C$ ?
     
  • 3.37, Аноним (37), 15:12, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Так это ещё с перла пошло называть переменные так.
     

  • 1.7, Аноним (7), 13:37, 21/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    из обычного, простого языка сделали какое-то недоразумение, изменения ради изменений

     
     
  • 2.10, commiethebeastie (ok), 13:46, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Сделали нормальный язык, а не мама, я сделяль сайт.
     
     
  • 3.15, Анон1110м (?), 14:14, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Как будто его переориентировали на другие задачи. Он и раньше был относительно нормальным для своих задач.
     
     
  • 4.22, Аноним (22), 14:51, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    есть опыт написания DHCP сервера на PHP
     
     
  • 5.57, Аноним (57), 17:24, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Есть) Отлично работает и на 5 версии, и на 7 и на 8) но другой вопрос зачем использовать то, что не нужно использовать.
     
  • 3.33, Аноним (37), 15:02, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > мама, я сделяль сайт

    Что в этом плохого? В то время можно было в одиночку целый сайт сделать и даже зарабатывать на посетителях, причем хотя его на бесплатном хостинге. Знал чела, который в 13 сделал сайт на пхп как раз, кажется в году 2006, в 2010 там посещаемость была уже сотни тысяч, сайт называть не буду, но многие около айтишники хоть раз да натыкались на него.

     
     
  • 4.52, Уникум (?), 16:42, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    anime.su?
     
  • 3.38, Аноним (7), 15:15, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    у пхп уже есть своя ниша, в которой он хорош, так же как существующие другие языки, которые занимают свои ниши. Соперничать с ними, переусложняя язык ненужным синтаксическим сахаром - плохая идея. Своими действиями они отталкивают часть прежних пользователей языка и не дают ничего нового потенциальным новым пользователя.

    в итоге есть шанс остаться у разбитого корыта.

     
  • 2.30, Сталин (?), 15:00, 21/11/2024 Скрыто ботом-модератором     [к модератору]
  • –3 +/
     
  • 2.55, nw (?), 16:55, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Это обычная ситуация для любого языка, который продолжает развиваться. Он начиается обрастать сахаром и доп.функиционалом. Из-за этого кажется монструозным.
     

  • 1.8, Аноним (8), 13:43, 21/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    PHP десятилетиями хоронят, а он не просто жив, но и развивается.
     
     
  • 2.11, Аноним (11), 13:58, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Это не развитие. Это отчаянные попытки вернуть тех, кто сваливал с него на протяжение последнего десятилетия. Типа "смотрите, у нас теперь тоже есть get/set-обработчики свойств, все как у больших дядей; вернитесь позязя... -_-"
     
     
  • 3.17, Аноним (17), 14:17, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Представьте себе, есть проекты, которые живут и развиваются десятилетиями, без ежегодного переписывания всего кода на язык, который сегодня в тренде. Вот для тех, кто по тем или иным причинам лет 10-15 назад выбрал PHP (а для ряда проектов это было вполне разумное решение), это всё очень полезно.

    Сейчас, конечно, начинать новый проект на PHP я не знаю зачем.

     
     
  • 4.20, Анон1110м (?), 14:21, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    А на чём стоит начинать и почему? Под проектом конечно же подразумевается очередной сайтик. PHP вдруг стал плохо подходить для очередного сайтика?
     
  • 4.42, пох. (?), 15:32, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > Представьте себе, есть проекты, которые живут и развиваются десятилетиями, без ежегодного
    > переписывания всего кода

    у меня для вас хреновая новость:
    включает серию новых возможностей, а также несколько изменений, нарушающих совместимость.

    и такая дребедень - каждый день. А ваш php5.4 (несовместимый с 5.3! Про историю с 5.2 замнем за давностию лет) не поддерживается. И 7 не поддерживается. И скоро с нытьем про нехватку рук, энтузиазма и туалетной бумаги - перестанут и 8.0-8.3

    Ну и как себя чувствует проект который десятилетие нужно именно что ежегодно переписывать чтоб вообще работало - на том же самом (но не совсем) языке?

     
     
  • 5.45, Аноним (17), 16:08, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Переходить на 5.4 с 5.3 в свое время за отсутствием хорошего инструментария было болезненно. Современные IDE и линтеры это всё упрощают - можно на 99% проанализировать на совместимость статически и исправить несовместимости (часто даже автоматическим рефакторингом, как в случае с ?Type = null), а остальное словится при запуске test suite. Сравнивать это с переписыванием на другой язык даже не смешно.
     
     
  • 6.48, пох. (?), 16:31, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    угу-угу, астролябия ж сама все меряет.

    А по факту у тебя проект десятилетнего возраста (то есть уже пару поколений разработчиков пережил и никто из живущих не в курсе, что там и зачем) который проще переписать заново чем поштучно выковыривать все несовместимости. И да, при этом по сути будет все равно, на тот же язык или на отдаленно похожий. Все равно это реверс требований и рефакторинг с нуля.

    Даже проще на совсем другой инструментарий, поскольку делать это ты очевидно будешь - по частям. А два php всяко хуже чем php и какая-нибудь нода.

     
  • 3.18, Анон1110м (?), 14:17, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Как не откро. какой фрилансерский сайт так там постоянно полно объявлений связанных с PHP. Богомерзкий Node.js тоже есть, но поменьше.
     
  • 2.16, Жироватт (ok), 14:16, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Хоронили php - порвали джва баяна \
    Мне сегодня можно, я сегодня пьяный \

    Но да, имело бы смысл заморозить php на крайней версии 7 и делать уже нормальный php 8 через транспилятор.

     
     
  • 3.29, Rev (ok), 14:59, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Первая версия тоже крайняя. На ней замораживать?
     
     
  • 4.49, пох. (?), 16:33, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > Первая версия тоже крайняя. На ней замораживать?

    просто опоздавшие родиться не помнят эпика с foreach. Когда выяснилось что разработчики нескучного языка настолько альтернативно одарены, что могут сломать совместимость даже просто в minor release. И да, разумеется предыдущий никто даже и не думал поддерживать.

     
  • 2.28, Аноним (37), 14:58, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Это не развитие, это уже овер инжиниринг.
     
     
  • 3.31, ьщккгнр (?), 15:01, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    оверинжиниринг — это второе имя PHP ;)
     
     
  • 4.36, Аноним (37), 15:08, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Сегодня может быть, но для меня пыха закончилась на 4й версии, потом туда начали навязывать ООП, которое для вэба как раз является сферическим овер инжинирингом.
     

  • 1.21, Аноним (22), 14:47, 21/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Интересно, что и как у хейтеров порвётся когда они узнают про swoole 🤔
     
     
  • 2.27, Нинзя (?), 14:58, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    От IR порвались видимо расшифровали тот ллвм
     

  • 1.25, Аноним (37), 14:55, 21/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    Когда-то, во времена 4й версии, это был действительно нормальный язык, заточенный под конкретную область. Сегодня это монстр, который сложнее джавы и сишарпа вместе взятых, да и смысла в нем нет, веб давно уже на микросервисах.
     
     
  • 2.32, Rev (ok), 15:01, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Да, как язык был норм. Только все названия функций приходилось смотреть в доках, ибо они все именовались по-разному, и набор параметров в разном порядке у похожих функций был. Плюс, дикие тормоза были.
     
     
  • 3.35, Аноним (37), 15:06, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Не знаю какие там у тебя тормоза были, у меня на 3 пне с 512 мб "денвер" летал, когда занимался разработкой, причем разрабатывал серьезные сайты, а не одностраничники, ну и не говори что сейчас ты научился кодить без гугла и без открытого мануала.
     

  • 1.43, Соль земли (?), 15:34, 21/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    > единый для всех архитектур бэкенд и генерирует промежуточное представление (IR), которое затем дополнительно оптимизируется и преобразуется в машинные инструкции для нужной целевой платформы.

    LLVM напоминает.

     
  • 1.44, Дед Анон (?), 15:44, 21/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Добавления новых функций и упрощение написания сложных конструкций приветствуется, но вот усложнение с повышением монструозности кода, это вообще лишнее. С каждым релизом что-то да выпиливается. Да оставь те вы для совместимости и всего делов.
     
     
  • 2.46, Аноним (46), 16:17, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > Да оставь те вы для совместимости и всего делов.

    Да не юзай ты его и делов то :)

     
  • 2.50, пох. (?), 16:36, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Добавления новых функций и упрощение написания сложных конструкций приветствуется, но
    > вот усложнение с повышением монструозности кода, это вообще лишнее. С каждым
    > релизом что-то да выпиливается.

    это называетса вжопп секурити или как-то похоже.

    Короче, у тебя до пенсии будет работа по переписыванию одного и того же кода, без конца.

     

  • 1.51, Аноним (51), 16:38, 21/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Давно свичнулся, но продолжаю следить за PHP.
    И после такого: "function save(?Book $book = null) {}" Ни разу не пожалел.

    PHP реально уже не актуален. Админки и CRUD, где PHP был идеален, уже пилят на TS/JS + json backend на любом языке.
    ХЗ где его применять.

    PHP с каждой версией все больше напоминает франкинштейна, тело которого собрано из частей Perl, C++, Java, и упаси Боже - JS.

     
  • 1.53, Аноним (53), 16:44, 21/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >Предложена новая реализация JIT-компилятора, построенная на базе IR Framework. Ключевое отличие в том, что старый JIT напрямую генерировал машинные инструкции на основе байткода и с использованием разных бэкендов для архитектур x86_64 и AArch64, а новый JIT использует единый для всех архитектур бэкенд и генерирует промежуточное представление (IR), которое затем дополнительно оптимизируется и преобразуется в машинные инструкции для нужной целевой платформы.

    Лишь бы LLVM не использовать.

     
  • 1.54, Аноним (53), 16:46, 21/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >Добавлена поддержка прикрепления обработчиков свойств (property hook), позволяющих добавить дополнительную логику, выполняемую при изменении или доступе к свойствам объекта

    Превращаются брюки ... брюки превращаются ... в ASP.Net!

    Ну действительно, там и JIT от C# из коробки, и ЯП нормальный, и куча либ...

     
  • 1.56, FreeStyler (ok), 17:00, 21/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Long live! Кормит
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру