PHP 8.1 ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಭಾಷೆಯ ಬಿಡುಗಡೆ

ಒಂದು ವರ್ಷದ ಅಭಿವೃದ್ಧಿಯ ನಂತರ, PHP 8.1 ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಭಾಷೆಯ ಬಿಡುಗಡೆಯನ್ನು ಪ್ರಸ್ತುತಪಡಿಸಲಾಯಿತು. ಹೊಸ ಶಾಖೆಯು ಹೊಸ ವೈಶಿಷ್ಟ್ಯಗಳ ಸರಣಿಯನ್ನು ಒಳಗೊಂಡಿದೆ, ಜೊತೆಗೆ ಹೊಂದಾಣಿಕೆಯನ್ನು ಮುರಿಯುವ ಹಲವಾರು ಬದಲಾವಣೆಗಳನ್ನು ಒಳಗೊಂಡಿದೆ.

PHP 8.1 ನಲ್ಲಿ ಪ್ರಮುಖ ಸುಧಾರಣೆಗಳು:

  • Добавлена поддержка перечислений, например, теперь можно использовать следующие конструкции: enum Status { case Pending; case Active; case Archived; } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Добавлена поддержка легковесных потоков, именуемых файберами (Fiber) и позволяющими управлять потоками выполнения на низком уровне. Поддержку файберов планируется добавить во фреймворки Amphp и ReactPHP. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend(‘after suspending’); // … }); $valueAfterSuspending = $fiber->start(); $fiber->resume(‘after resuming’);
  • Улучшена реализация кэша объектного кода (opcache), в которой появилась возможность кэширования информации о наследовании классов. Оптимизация позволила поднять производительность некоторых приложений на 5-8%. Из других оптимизаций отмечается оптимизация работы JIT, реализация поддержки JIT для архитектуры ARM64 (AArch64), ускорение разрешения имён, оптимизация библиотек timelib и ext/date, повышение производительности сериализации и десериализации, оптимизация функция get_declared_classes(), explode(), strtr(), strnatcmp(), dechex(). В общем виде отмечается повышение производительности Symfony Demo на 23.0%, а WordPress на 3.5%.
  • Оператор распаковки внутри массивов «…$var», позволяющий выполнять подстановку существующих массивов при определении нового массива, расширен поддержкой строковых ключей (ранее поддерживались только цифровые идентификаторы). Например, теперь можно использовать в коде: $array1 = [«a» => 1]; $array2 = [«b» => 2]; $array = [«a» => 0, …$array1, …$array2]; var_dump($array); // [«a» => 1, «b» => 2]
  • Разрешено использовать ключевое слово «new» в инициализаторах, например, в определениях функций в качестве параметра по умолчанию или в атрибутах аргуметов. class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
  • Предоставлена возможность пометки свойств класса для доступа только для чтения (информация в подобные свойства может быть записана только один раз, после чего не будет доступна для изменения). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post(‘Title’, /* … */); $post->title = ‘Other’; > Error: Cannot modify readonly property Post::$title
  • Реализован новый синтаксис для вызываемых объектов (callable) — замыкание теперь можно сформировать, вызвав функцию и передав ей в качестве аргумента значение «…» (т.е. myFunc(…) вместо Closure::fromCallable(‘myFunc’)): function foo(int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Добавлена полноценная поддержка пересекающихся типов (intersection types), позволяющих создавать новые типы, комбинируя существующие. В отличие от union-типов, определяющих коллекции из двух и более типов, intersection-типы требуют наличия в заполняемом множестве не любого из перечисленных типов, а всех указанных типов. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Появился новый тип «never», который можно использовать для информирования статических анализаторов о том, что функция прекращает выполнение программы, например, вызывая исключение или выполняя функцию exit. function dd(mixed $input): never { exit; }
  • Предложена новая функция array_is_list, позволяющая определить, что ключи в массиве расположены в порядке увеличения числовых значений, начиная с 0: $list = [«a», «b», «c»]; array_is_list($list); // true $notAList = [1 => «a», 2 => «b», 3 => «c»]; array_is_list($notAList); // false $alsoNotAList = [«a» => «a», «b» => «b», «c» => «c»]; array_is_list($alsoNotAList); // false
  • Для запрета переопределения констант родительского класса теперь можно использовать ключевое слово «final». class Foo { final public const X = «foo»; } class Bar extends Foo { public const X = «bar»; > Fatal error: Bar::X cannot override final constant Foo::X }
  • Предложены функции fsync и fdatasync для принудительного сохранения изменений из дискового кэша. $file = fopen(«sample.txt», «w»); fwrite($file, «Some content»); if (fsync($file)) { echo «File has been successfully persisted to disk.»; } fclose($file);
  • Добавлена возможность использования префиксов «0o» и «0O» для восьмеричных чисел, помимо ранее применявшегося префикса «0». 016 === 0o16; // true 016 === 0O16; // true
  • Предложено выборочно ограничить применение $GLOBALS, что приведёт к нарушению обратной совместимости, но даст возможность значительно ускорить операции с массивами. Например, рассматривается возможность запрета записи в $GLOBALS и передачи $GLOBALS по указателю. Анализ 2000 пакетов показал, что только 23 из них затронет данное изменение. Например, в случае одобрения предложения в 8.1 будет прекращена поддержка таких выражений, как: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
  • Внутренние методы теперь должны возвращать корректный тип. В PHP 8.1 при возвращении типа, не соответствующего объявлению функции, будут выводиться предупреждение, но в PHP 9.0 предупреждение будет заменено на ошибку.
  • Продолжена работа по переводу функций c использования ресурсов на манипуляцию объектами. На объекты переведены функции finfo_* и imap_*.
  • Объявлена устаревшей передача значений null в качестве аргументов внутренних функций, помеченных как non-nullable. В PHP 8.1 использование конструкций вида str_contains(«string», null) будет приводить к предупреждению, а в PHP 9 к ошибке.
  • Добавлена поддержка алгоритмов хэширования MurmurHash3 и xxHash.

ಮೂಲ: opennet.ru

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ