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 обязательно


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

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

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

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

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

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

     
  • 2.30, Сталин (?), 15:00, 21/11/2024 Скрыто ботом-модератором     [к модератору]
  • –3 +/
     

     ....ответы скрыты (7)

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

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

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

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

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

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

     
  • 3.18, Анон1110м (?), 14:17, 21/11/2024 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 2.16, Жироватт (ok), 14:16, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Хоронили php - порвали джва баяна \
    Мне сегодня можно, я сегодня пьяный \

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

     
     
  • 3.23, Аноним (23), 14:54, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    А ты так с избрания Трампа и не просыхаешь.
     
  • 3.29, Rev (ok), 14:59, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Первая версия тоже крайняя. На ней замораживать?
     
  • 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 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Сегодня может быть, но для меня пыха закончилась на 4й версии, потом туда начали навязывать ООП, которое для вэба как раз является сферическим овер инжинирингом.
     

  • 1.13, Аноним (13), 14:10, 21/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Зачем?
     
     
  • 2.14, Жироватт (ok), 14:14, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Чтобы лично ты спросил?
     
  • 2.26, Аноним (37), 14:57, 21/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Донаты, гранты, стипендии и субсидии сами себя не соберут.
     

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

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

  • 1.39, Bottle (?), 15:17, 21/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Пыха жива и будет жить, даже переживёт сишечку.
     
  • 1.41, nume (ok), 15:31, 21/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Интересно, кто з@охнет первым как pascal, java или php?
     
  • 1.43, Соль земли (?), 15:34, 21/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > единый для всех архитектур бэкенд и генерирует промежуточное представление (IR), которое затем дополнительно оптимизируется и преобразуется в машинные инструкции для нужной целевой платформы.

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

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

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



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

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