Рэліз мовы праграмавання PHP 8.3

Пасля года распрацоўкі прадстаўлены рэліз мовы праграмавання PHP 8.3. Новая галінка ўключае серыю новых магчымасцяў, а таксама некалькі змен, якія парушаюць сумяшчальнасць.

Ключавыя змены ў PHP 8.3:

  • Падчас кланавання класаў прадстаўлена магчымасць паўторнай ініцыялізацыі ўласцівасцяў з атрыбутам "readonly". Пераазначэнне readonly-уласцівасцяў дапушчаецца толькі ўсярэдзіне функцый «__clone»: readonly class Post { public function __construct( public DateTime $createdAt, ) {} public function __clone() { $this->createdAt = new DateTime(); // дазволена, нягледзячы на ​​тое, што ўласцівасць "createdAt" даступна ў рэжыме толькі для чытання. } }
  • Дана магчымасць выкарыстання канстант з указаннем тыпу ў класах, тыпажах і пералічэннях: class Foo { const string BAR = 'baz'; }
  • Дададзена падтрымка атрыбуту "#[Override]", пры дапамозе якога распрацоўшчык можа інфармаваць інтэрпрэтатар аб тым, што адзначаны метад перавызначае нейкі бацькоўскі метад. У выпадку, калі пераазначэння не будзе інтэрпрэтатар выведзе памылку.
  • Зменена апрацоўка адмоўных значэнняў у якасці індэкса масіва. Напрыклад, пры даданні ў пусты масіў элемента з нумарам "-5" і даданні яшчэ аднаго элемента, раней другі элемент захоўваўся з азначнікам "0", а пачынальна з версіі PHP 8.3 будзе захоўвацца з азначнікам "-4". $array = []; $array[-5] = 'a'; $array[] = 'b'; var_export($array); // Было array (-5 => 'a', 0 => 'b') // Стала array (-5 => 'a', -4 => 'b')
  • Дададзена магчымасць стварэння ананімных класаў у рэжыме толькі для чытання: $class = new readonly class { public function __construct( public string $foo = 'bar', ) {} };
  • Дададзена функцыя json_validate() для хуткай праверкі адпаведнасці радкі фармату JSON без выканання аперацый дэкадавання. json_validate(string $json, int $depth = 512, int $flags = 0): bool
  • У клас Randomizer, які прадстаўляе высокаўзроўневы API для генерацыі псеводослучайных лікаў і паслядоўнасцяў, дададзены новыя метады: getBytesFromString для фармавання радка зададзенага памеру, якая выкарыстоўвае ў выпадковым парадку знакі, прысутныя ў іншым радку; getFloat і nextFloat для генерацыі выпадковага ліку з якая плавае коскі, які ўкладваецца ў паказаны дыяпазон.
  • Дададзена магчымасць вымання канстант, выкарыстаючы сінтаксіс дынамічных класаў: class Foo { const BAR = 'bar'; } $name = 'BAR'; // Раней для вымання канстанты BAR трэба было выклікаць constant(Foo::class . '::' . $name); // А цяпер дастаткова пазначыць Foo::{$name};
  • Дададзена генерацыя асобных выключэнняў (DateMalformedIntervalStringException, DateInvalidOperationException, DateRangeError) у выпадку праблем, якія ўзнікаюць у аперацыях працы з датамі і часам.
  • Палепшана апрацоўка памылак, якія ўзнікаюць падчас разбору серыялізаваных дадзеных у функцыі unserialize(). У выпадку праблем unserialize() зараз выдае код E_WARNING замест E_NOTICE.
  • Унесены змены ў функцыю range(). Забяспечана генерацыя выключэння пры спробе перадачы аб'ектаў, рэсурсаў або масіваў у зменных, якія вызначаюць межы дыяпазону, а таксама пры ўказанні адмоўнага значэння ў параметры $step або нявызначанага значэння ў любым параметры. Забяспечана вывад спісу сімвалаў пры ўказанні радкоў замест лікаў (напрыклад, «range('5', 'z')»).
  • Зменены паводзіны тыпажоў са статычнымі ўласцівасцямі, якія зараз перавызначаюць статычныя ўласцівасці, атрыманыя ў спадчыну з бацькоўскага класа.
  • Дададзеныя наладкі для абароны ад перапаўнення стэка. У ini-файл дададзены дырэктывы zend.max_allowed_stack_size і zend.reserved_stack_size, якія вызначаюць максімальна дазволены і зарэзерваваны памер стэка. Праграма будзе завяршацца памылкай пры набліжэнні да вычарпання стэка, калі стэк запоўнены больш, чым на розніцу паміж значэннямі zend.max_allowed_stack_size і zend.reserved_stack_size (выкананне будзе спынена не даводзячы сітуацыю да ўзнікнення segmentation fault). Па змаўчанні значэнне zend.max_allowed_stack_size выстаўлена ў 0 (0 - памер вызначаецца аўтаматычна, для адключэння абмежавання можна выставіць -1).
  • Дададзены новыя POSIX-функцыі posix_sysconf(), posix_pathconf(), posix_fpathconf() і posix_eaccess().
  • Дададзена функцыя mb_str_pad, уяўлялая сабой аналог радковай функцыі str_pad(), разлічаны на працу з шматбайтавымі кадоўкамі, такімі як UTF-8.
  • Дазволена стварэнне замыканняў з метадаў і перадачы найменных аргументаў у гэтыя замыканні. $test = new Test(); $closure = $test->magic(…); $closure(a: 'hello', b: 'world');
  • Змененыя паводзіны пры апрацоўцы бачнасці канстант у інтэрфейсах. interface I { public const FOO = 'foo'; } class C implements I { private const FOO = 'foo'; }
  • Пашыраныя магчымасці функцый array_sum(), array_product(), posix_getrlimit(), gc_status(), class_alias(), mysqli_poll(), array_pad() і proc_get_status().
  • Абвешчаная састарэлай магчымасць перадачы адмоўнага значэння $widths у mb_strimwidth(). Выдалена канстанта NumberFormatter::TYPE_CURRENCY. Спынена падтрымка выкліку функцыі ldap_connect() з двума параметрамі $host і $port. Выдалена настройка opcache.consistency_checks.

Крыніца: opennet.ru

Дадаць каментар