ఒక సంవత్సరం అభివృద్ధి తర్వాత, PHP 8.1 ప్రోగ్రామింగ్ భాష విడుదల చేయబడింది. కొత్త బ్రాంచ్లో కొత్త ఫీచర్ల శ్రేణి, అలాగే అనుకూలతను విచ్ఛిన్నం చేసే అనేక మార్పులు ఉన్నాయి.
PHP 8.1లో కీలక మెరుగుదలలు:
- గణనలకు మద్దతు జోడించబడింది, ఉదాహరణకు, మీరు ఇప్పుడు క్రింది నిర్మాణాలను ఉపయోగించవచ్చు: enum స్థితి {కేసు పెండింగ్లో ఉంది; కేసు యాక్టివ్; కేసు ఆర్కైవ్ చేయబడింది; } తరగతి పోస్ట్ {పబ్లిక్ ఫంక్షన్ __నిర్మాణం(ప్రైవేట్ స్టేటస్ $స్టేటస్ = స్టేటస్::పెండింగ్;) {} పబ్లిక్ ఫంక్షన్ సెట్స్టేటస్(స్టేటస్ $స్టేటస్): శూన్యం {//…}} $పోస్ట్->సెట్స్టేటస్(స్టేటస్::యాక్టివ్);
- Добавлена поддержка легковесных потоков, именуемых файберами (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 ($ అర్రే); // ["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(); }
- ఒక ఫంక్షన్ ప్రోగ్రామ్ ఎగ్జిక్యూషన్ను రద్దు చేస్తుందని స్టాటిక్ ఎనలైజర్లకు తెలియజేయడానికి "నెవర్" అనే కొత్త రకం ఉంది, ఉదాహరణకు మినహాయింపును విసిరివేయడం లేదా నిష్క్రమణ ఫంక్షన్ని అమలు చేయడం ద్వారా. ఫంక్షన్ dd(మిశ్రమ $ఇన్పుట్): ఎప్పుడూ {నిష్క్రమించవద్దు; }
- array_is_list అనే కొత్త ఫంక్షన్ ప్రతిపాదించబడింది, ఇది 0: $list = [“a”, “b”, “c”] నుండి ప్రారంభమయ్యే సంఖ్యా విలువలను పెంచే క్రమంలో శ్రేణిలోని కీలు అమర్చబడి ఉన్నాయని నిర్ధారించడానికి మిమ్మల్ని అనుమతిస్తుంది; array_is_list($list); // నిజమైన $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list($notAList); // తప్పుడు $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // తప్పు
- Для запрета переопределения констант родительского класса теперь можно использовать ключевое слово «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, "కొంత కంటెంట్"); if (fsync($file)) {echo "ఫైల్ డిస్క్కి విజయవంతంగా కొనసాగించబడింది."; } fclose($file);
- గతంలో ఉపయోగించిన "0" ఉపసర్గతో పాటు, అష్ట సంఖ్యల కోసం "0o" మరియు "0O" ఉపసర్గలను ఉపయోగించగల సామర్థ్యం జోడించబడింది. 016 === 0o16; // నిజమైన 016 === 0O16; // నిజం
- $GLOBALS వినియోగాన్ని ఎంపికగా పరిమితం చేయాలని ప్రతిపాదించబడింది, ఇది వెనుకబడిన అనుకూలత ఉల్లంఘనకు దారి తీస్తుంది, కానీ శ్రేణులతో కార్యకలాపాలను గణనీయంగా వేగవంతం చేయడం సాధ్యపడుతుంది. ఉదాహరణకు, $GLOBALSకి వ్రాయడం నిలిపివేయడం మరియు పాయింటర్ ద్వారా $GLOBALSని పాస్ చేసే అవకాశం పరిగణించబడుతోంది. 2000 ప్యాకేజీల విశ్లేషణలో కేవలం 23 ప్యాకేజీలు మాత్రమే ఈ మార్పు ద్వారా ప్రభావితమవుతాయని తేలింది. ఉదాహరణకు, ప్రతిపాదన ఆమోదించబడినట్లయితే, 8.1 ఇకపై అటువంటి వ్యక్తీకరణలకు మద్దతు ఇవ్వదు: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; అన్సెట్ ($GLOBALS); by_ref($GLOBALS);
- Внутренние методы теперь должны возвращать корректный тип. В PHP 8.1 при возвращении типа, не соответствующего объявлению функции, будут выводиться предупреждение, но в PHP 9.0 предупреждение будет заменено на ошибку.
- వనరులను ఉపయోగించడం నుండి వస్తువులను మార్చడం వరకు విధులను బదిలీ చేయడంపై పని కొనసాగింది. finfo_* మరియు imap_* ఫంక్షన్లు ఆబ్జెక్ట్లకు బదిలీ చేయబడ్డాయి.
- శూన్యత లేనిదిగా గుర్తించబడిన అంతర్గత ఫంక్షన్లకు ఆర్గ్యుమెంట్లుగా శూన్య విలువలను పాస్ చేయడం నిలిపివేయబడింది. PHP 8.1లో, str_contains("string", null) వంటి నిర్మాణాలను ఉపయోగించడం హెచ్చరికకు దారి తీస్తుంది మరియు PHP 9లో లోపానికి దారి తీస్తుంది.
- MurmurHash3 మరియు xxHash హ్యాషింగ్ అల్గారిథమ్లకు మద్దతు జోడించబడింది.
మూలం: opennet.ru