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

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

Ключавыя паляпшэнні ў PHP 8.2:

  • Дададзена магчымасць пазнакі класа даступным толькі для чытання. Уласцівасці ў падобных класах могуць быць зададзены толькі адзін раз, пасля чаго не будуць даступны для змены. Раней толькі для чытання маглі пазначацца асобныя ўласцівасці класа, а зараз зараз можна ўключыць дадзены рэжым для ўсіх уласцівасцяў класа. Указанне сцяга «readonly» на ўзроўні класа таксама блакуе дынамічнае даданне ўласцівасцей у клас. readonly class Post { public function __construct( public string $title, public Author $author, ) {} } $post = new Post(/* … */); $post->unknown = 'wrong'; // Error: Cannot create dynamic property Post::$unknown
  • Дададзеныя асобныя тыпы "true", "false" і "null", якія могуць прымаць толькі адно дапушчальнае значэнне і выкарыстоўвацца, напрыклад, для вяртання функцыяй прыкметы завяршэння з памылкай ці пустога значэння. Раней "true", "false" і "null" маглі выкарыстоўвацца толькі ў звязку з іншымі тыпамі (напрыклад, "string|false"), а зараз могуць ужывацца асобна: function alwaysFalse(): false { return false; }
  • Прадастаўлена магчымасць фільтрацыі канфідэнцыйных параметраў у дадзеных трасіроўкі стэка, якія выводзяцца падчас памылкі. Выразанне пэўнай інфармацыі можа запатрабавацца калі звесткі аб якія ўзнікаюць памылках аўтаматычна накіроўваюцца ў іншыя сэрвісы, якія адсочваюць праблемы і якія інфармуюць пра іх распрацоўнікаў. Напрыклад, можна выключыць з трасіроўкі параметры, якія ўключаюць імёны карыстальнікаў, паролі і зменныя асяроддзі. function test( $foo, #[\SensitiveParameter] $password, $baz ) { throw new Exception('Error'); } test('foo', 'password', 'baz'); Error error: Uncaught Exception: Error in test.php:8 Stack trace: #0 test.php(11): test('foo', Object(SensitiveParameterValue), 'baz') #1 {main} thrown in test.php on line 8
  • Дазволена вызначэнне канстант у тыпажах (trait, механізм для паўторнага выкарыстання кода). Доступ да канстантаў, вызначаных у тыпажы, можна атрымаць праз клас, які выкарыстоўвае тыпаж (але не праз імя тыпажу). trait Foo {public const CONSTANT = 1; public function bar(): int { return self::CONSTANT; // Fatal error } } class Bar { use Foo; } var_dump(Bar::CONSTANT); // 1
  • Дададзена магчымасць задання тыпаў у дыз'юнктыўнай нармальнай форме (DNF, Disjunctive Normal Form), якая дазваляе сумясціць аб'яднанне тыпаў (калекцыі з двух і больш тыпаў) і скрыжаванне тыпаў (тыпы, значэнні якіх падпадаюць адначасова пад некалькі тыпаў). class Foo { public function bar((A&B)|null $entity) { if ($entity === null) { return null; } return $entity; } }
  • Прапанавана новая пашырэнне «Random» c функцыямі і класамі для генерацыі псеводослучайных лікаў і паслядоўнасцяў. Модуль падае аб'ектна-арыентаваны інтэрфейс, дазваляе выбіраць розныя рухавічкі для генерацыі псеводослучайных лікаў, у тым ліку прыдатныя для ўжывання ў крыптаграфіі, і падае дапаможныя функцыі, напрыклад, для выпадковага мяшання масіваў і радкоў, выбару выпадковых ключоў масіва, адначасовага выкарыстання некалькіх генератараў са сваім. незалежным станам. $rng = $is_production ? new Random\Engine\Secure() : new Random\Engine\Mt19937(1234); $randomizer = новы Random\Randomizer($rng); $randomizer->shuffleString('foobar');
  • Рэалізавана незалежнае ад лакалі пераўтварэнне рэгістра сімвалаў. Функцыі, падобныя strtolower() і strtoupper(), зараз заўсёды пераўтвораць рэгістр знакаў у дыяпазоне ASCII як пры выстаўленні лакалі "З".
  • Дададзены новыя функцыі: mysqli_execute_query, curl_upkeep, memory_reset_peak_usage, ini_parse_quantity, libxml_get_external_entity_loader, sodium_crypto_stream_xchacha20_xor_ic, openssl_cipher_key_key
  • Дададзены новыя метады: mysqli::execute_query, ZipArchive::getStreamIndex, ZipArchive::getStreamName, ZipArchive::clearError, ReflectionFunction::isAnonymous, ReflectionMethod::hasPrototype.
  • Аб'яўлена састарэлай магчымасць дынамічнага стварэння ўласцівасцей у класе. У PHP 9.0 зварот да ўласцівасцяў, першапачаткова не вызначаным у класе, будзе прыводзіць да памылкі (ErrorException). Класы, якія прадстаўляюць метады __get і __set для стварэння ўласцівасцяў, ці дынамічныя ўласцівасці ў stdClass працягнуць працаваць без змен, спыніцца падтрымка толькі няяўнай працы з неіснуючымі ўласцівасцямі для таго каб абараніць распрацоўніка ад утоеных памылак. Для захавання працы старога кода прапанаваны атрыбут "#[AllowDynamicProperties]", які дазваляе выкарыстанне дынамічных уласцівасцяў.
  • Абвешчана састарэлай магчымасць падстаноўкі значэнняў зменных у радкі пры дапамозе выразаў «${var}» і ${(var)}». Падтрымка звычайна выкарыстоўваных падстановак "{$var}" і "$var" захавана. Напрыклад: "Hello {$world}"; OK "Hello $world"; OK "Hello ${world}"; Deprecated: Using ${} in strings is deprecated
  • Абвешчаныя састарэлымі часткова падтрымліваюцца выкліканыя аб'екты (callable), якія могуць быць выкліканыя праз call_user_func($callable), але не падтрымліваюць выклік у форме $callable(): self::method parent::method static ::method" ["self", "method"] ["parent", "method"] ["static", "method"] ["Foo", "Bar::method"] [new Foo, "Bar: :method»]
  • У налады дададзена дырэктыва error_log_mode, якая дазваляе вызначыць рэжым доступу да лога з памылкамі.

Крыніца: opennet.ru

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