PHP 8.2 программалоо тилинин чыгарылышы

Бир жылдык өнүгүүдөн кийин PHP 8.2 программалоо тилинин релизинин бет ачары болду. Жаңы бутак бир катар жаңы функцияларды, ошондой эле шайкештикти бузган бир нече өзгөртүүлөрдү камтыйт.

PHP 8.2деги негизги жакшыртуулар:

  • Классты окуу үчүн гана деп белгилөө мүмкүнчүлүгү кошулду. Мындай класстардагы касиеттерди бир гана жолу коюуга болот, андан кийин аларды өзгөртүүгө болбойт. Мурда класстын жеке касиеттери окуу үчүн гана белгилениши мүмкүн, бирок азыр сиз бул режимди бир эле учурда бардык класс касиеттери үчүн иштете аласыз. Класс деңгээлинде "окуу үчүн гана" желекчесин көрсөтүү касиеттердин класска динамикалык түрдө кошулушун бөгөттөйт. окуу үчүн гана класс Пост { public function __construct( public string $title, public Author $author, ) {} } $post = new Post(/* … */); $post->unknown = 'туура эмес'; // Ката: Динамикалык касиетти түзүү мүмкүн эмес Post::$белгисиз
  • Бир гана жарактуу маанини ала турган жана, мисалы, катаны токтотуу желекчеси же бош мааниси бар функцияны кайтаруу үчүн колдонулган "чын", "жалган" жана "нөл" деген өзүнчө типтер кошулду. Мурда “true”, “false” жана “null” башка түрлөр менен бирге гана колдонулушу мүмкүн (мисалы, “сап|жалган”), бирок азыр аларды өзүнчө колдонсо болот: function alwaysFalse(): false { return false ; }
  • Ката учурунда стек из чыгаруусунда сезимтал параметрлерди чыпкалоо мүмкүнчүлүгүн берет. Качан гана пайда болгон каталар тууралуу маалымат үчүнчү тараптын кызматтарына автоматтык түрдө жөнөтүлүп, көйгөйлөргө көз салып, иштеп чыгуучуларга алар тууралуу маалымат бергенде, кээ бир маалыматты өчүрүү зарыл болушу мүмкүн. Мисалы, колдонуучу аттары, сырсөздөр жана чөйрө өзгөрмөлөрү камтылган параметрлерди байкоодон чыгарсаңыз болот. function test( $foo, #[\SensitiveParameter] $password, $baz ) { throw new Exception('Error'); } test('foo', 'parol', 'baz'); Өчүрүүчү ката: Кармалбаган өзгөчөлүк: test.phpдеги ката:8 Стек изи: #0 test.php(11): test('foo', Object(SensitiveParameterValue), 'baz') #1 {main} test.phpге ыргытылды 8-сапта
  • Белгилердеги константаларды аныктоого уруксат берилген (сыпат, кодду кайра колдонуу механизми). Белгиде аныкталган туруктууларга белгини колдонгон класс аркылуу кирүүгө болот (бирок белгинин аты аркылуу эмес). trait Foo { public const CONSTANT = 1; public function bar(): int { return self::CONSTANT; // Өчүрүүчү ката } } class Bar { 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" сунушталды. Модуль объектиге багытталган интерфейсти камсыздайт, псевдококустук сандарды түзүү үчүн ар кандай кыймылдаткычтарды, анын ичинде криптографияда колдонууга ылайыктууларды тандоого мүмкүндүк берет жана кошумча функцияларды, мисалы, массивдерди жана саптарды туш келди аралаштыруу, туш келди массив баскычтарын тандоо, өз көз карандысыз мамлекет менен бир нече генераторлорду бир эле учурда пайдалануу. $rng = $is_production? new Random\Engine\Secure() : new Random\Engine\Mt19937(1234); $randomizer = new 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_length.
  • Жаңы ыкмалар кошулду: 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 "Салам ${world}"; Эскирген: Саптарда ${} колдонуу эскирген
  • "call_user_func($callable)" аркылуу чалууга мүмкүн болгон, бирок "$callable()": "self::method" "parent::method" "static" ::method түрүндө чалууну колдобой турган эскирген жарым-жартылай колдоого алынган чалуулар " ["self", "metod"] ["ата-эне", "метод"] ["статикалык", "метод"] ["Foo", "Bar::method"] [жаңы Foo, "Bar: :method" ]
  • error_log_mode директивасы жөндөөлөргө кошулуп, каталар журналына кирүү режимин аныктоого мүмкүндүк берет.

Source: opennet.ru

Комментарий кошуу