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

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

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

  • Саноолор үчүн кошумча колдоо, мисалы, сиз эми төмөнкү конструкцияларды колдоно аласыз: enum Status { case Pending; case Active; Archived case; } class Post { коомдук функция __construct( купуя Статус $статус = Статус::Күтүүдө; ) {} коомдук функция setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Аткаруу жиптерин төмөнкү деңгээлде башкарууга мүмкүндүк берген Fibers деп аталган жеңил жиптерге колдоо кошулду. Fiber колдоосун Amphp жана ReactPHP алкактарына кошуу пландаштырылууда. $fiber = new Fiber(функция (): void { $valueAfterResuming = Fiber::suspend('токтотуудан кийин'); // ...}); $valueAfterSuspending = $fiber->start(); $fiber->resume('жаңыдан кийин');
  • Объект кодунун кэшинин (opcache) ишке ашырылышы жакшыртылды, бул класстын мурастоосу жөнүндө маалыматты кэш кылууга мүмкүндүк берет. Оптималдаштыруу кээ бир тиркемелердин өндүрүмдүүлүгүн 5-8% га жогорулатууга мүмкүндүк берди. Башка оптималдаштырууларга JIT операциясын оптималдаштыруу, ARM64 архитектурасы үчүн JIT колдоосун ишке ашыруу (AArch64), атын чечүүнү тездетүү, timelib жана экс/дата китепканаларын оптималдаштыруу, сериалдаштыруу жана сериялаштыруу көрсөткүчтөрүн жогорулатуу, 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]
  • "Жаңы" ачкыч сөздү инициализаторлордо колдонууга уруксат берилет, мисалы функциянын аныктамаларында демейки параметр катары же аргумент атрибуттарында. class MyController { коомдук функция __конструкция(жеке Logger $logger = new NullLogger(), ) {} }
  • Окуу үчүн гана жеткиликтүүлүк үчүн класстын касиеттерин белгилөөгө болот (мындай касиеттердеги маалымат бир гана жолу жазылат, андан кийин аны өзгөртүүгө болбойт). class PostData { коомдук функция __конструкция(жалпы окуу үчүн гана сап $title, ачык окуу үчүн гана DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = 'Башка'; > Ката: Окуу үчүн гана касиетти өзгөртүү мүмкүн эмес Post::$title
  • Чакырылган объекттер үчүн жаңы синтаксис ишке ашырылды - жабууну эми функцияны чакырып, ага аргумент катары "..." маанисин берүү аркылуу түзсө болот (мис. Closure::fromCallable('myFunc) ордуна myFunc(...)) ')): функция foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Учурдагыларды айкалыштыруу менен жаңы типтерди түзүүгө мүмкүндүк берген кесилиштердин түрлөрү үчүн толук колдоо кошулду. Эки же андан көп түрдөгү коллекцияларды аныктаган биримдиктин түрлөрүнөн айырмаланып, кесилишкен типтер толтурула турган топтомдо саналган типтердин бири да эмес, бардык көрсөтүлгөн типтердин болушун талап кылат. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Статикалык анализаторлорго функция программанын аткарылышын токтото тургандыгы жөнүндө кабарлоо үчүн колдонула турган "эч качан" жаңы түрү бар, мисалы, өзгөчө учурду таштоо же чыгуу функциясын аткаруу. function dd(mixed $input): never { exit; }
  • Жаңы array_is_list функциясы сунушталды, ал массивдеги баскычтар 0дөн баштап сандык маанилердин көбөйүү тартибинде жайгаштырылышын аныктоого мүмкүндүк берет: $list = [“a”, “b”, “c”]; array_is_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); // жалган
  • Сиз эми ата-эне классынын константаларынын жокко чыгарылышын алдын алуу үчүн "акыркы" ачкыч сөзүн колдоно аласыз. class Foo { final public const X = "foo"; } class Bar extensions Foo { public const X = "bar"; > Өчүрүүчү ката: Bar::X акыркы туруктуу Foo::X жокко чыгара албайт }
  • fsync жана fdatasync функциялары диск кэшинен өзгөртүүлөрдү сактоого мажбурлоо үчүн сунушталат. $file = fopen("sample.txt", "w"); fwrite($файл, "Кээ бир мазмун"); if (fsync($file)) { echo "Файл дискте ийгиликтүү сакталды."; } fclose($файл);
  • Мурда колдонулган "0" префиксинен тышкары сегиздик сандар үчүн "0o" жана "0O" префикстерин колдонуу мүмкүнчүлүгү кошулду. 016 === 0o16; // true 016 === 0O16; // чын
  • $GLOBALS колдонууну тандап чектөө сунушталууда, бул артка кайтуу шайкештиктин бузулушуна алып келет, бирок массивдер менен операцияларды кыйла тездетүүгө мүмкүндүк берет. Мисалы, $GLOBALSке жазууну өчүрүү жана көрсөткүч менен $GLOBALS өткөрүү мүмкүнчүлүгү каралууда. 2000 пакеттин анализи алардын 23үнө гана бул өзгөртүү таасир этээрин көрсөттү. Мисалы, эгер сунуш жактырылса, 8.1 мындан ары төмөнкүдөй туюнтмаларды колдоого албайт: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
  • Ички ыкмалар эми туура түрүн кайтарышы керек. PHP 8.1де функциянын декларациясына дал келбеген түрүн кайтаруу эскертүү берет, бирок PHP 9.0до эскертүү ката менен алмаштырылат.
  • Функцияларды ресурстарды пайдалануудан объекттерди манипуляциялоого өткөрүү боюнча иштер улантылды. finfo_* жана imap_* функциялары объекттерге өткөрүлүп берилди.
  • Нөл эмес деп белгиленген ички функцияларга аргумент катары нөл маанилерди берүү эскирди. PHP 8.1де str_contains("string", null) сыяктуу конструкцияларды колдонуу эскертүүгө, ал эми PHP 9да катага алып келет.
  • MurmurHash3 жана xxHash хэш алгоритмдерине колдоо кошулду.

Source: opennet.ru

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