Pas një vit zhvillimi, u prezantua lëshimi i gjuhës së programimit PHP 8.2. Kjo degë e re përmban një sërë mundësish të reja, si dhe disa ndryshime që shkelin përputhshmërinë.
Përmirësimet kryesore në PHP 8.2:
- Shtuar mundësinë e shënjimit të klasës si të lexueshme vetëm. Pasuritë në këto klasa mund të caktohen vetëm një herë, pas së cilës nuk do të jenë më të disponueshme për modifikim. Më parë, vetëm pasuritë e veçanta të klasës mund të shënoheshin si të lexueshme, ndërsa tani mund të aktivizohet ky mod për të gjitha pasuritë e klasës. Caktimi i flamurit 'readonly' në nivelin e klasës gjithashtu bllokon shtimin dinamik të pasurive në klasë. readonly class Post { public function __construct( public string $title, public Author $author, ) {} } $post = new Post(/* … */); $post->unknown = ‘wrong’; // Gabim: Nuk mund të krijohet pasuri dinamike Post::$unknown
- Shtuar lloje të veçanta "true", "false" dhe "null", të cilat mund të marrin vetëm një vlerë të lejuar dhe mund të përdoren, për shembull, për të kthyer nga funksioni një shenjë të përfundimit me gabim ose një vlerë bosh. Më parë, "true", "false" dhe "null" mund të përdoren vetëm në lidhje me tipe të tjera (p.sh., "string|false"), ndërsa tani mund të aplikohen veçmas: function alwaysFalse(): false { return false; }
- E mundësuar filtrimi i parametrave të ndjeshme në të dhënat e gjurmimeve të stack-ut, që jepen gjatë një gabimi. Heqja e informacionit të caktuar mund të jetë e nevojshme kur detajet mbi gabimet që ndodhin dërgohen automatikisht në shërbime të jashtme që ndjekin probleme dhe informojnë zhvilluesit. Për shembull, mund të përjashtohen nga gjurmimi parametrat që përmbajnë emrat e përdoruesve, fjalëkalimet dhe variablat e ambientit. function test( $foo, #[\SensitiveParameter] $password, $baz ) { throw new Exception(‘Error’); } test(‘foo’, ‘password’, ‘baz’); Fatal 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
- Lejohet përcaktimi i konstantave në tipazhe (trait, mekanizëm për ripërdorimin e kodit). Qasja në konstantat e përcaktuara në tipazh mund të merret përmes klasës që përdor tipazhin (por jo përmes emrit të tipazhit). trait Foo { public const CONSTANT = 1; public function bar(): int { return self::CONSTANT; // Gabim fatal } } 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; } }
- Është propozuar një zgjerim i ri "Random" me funksione dhe klasa për gjenerimin e numrave dhe sekuencave pseudo-të rastësishme. Moduli ofron një ndërfaqe të orientuar nga objekti, lejon zgjedhjen e motorëve të ndryshëm për gjenerimin e numrave pseudo-të rastësishëm, përfshirë ato të përshtatshëm për aplikim në kriptografi, dhe ofron funksione ndihmës, për shembull, për trazimin e rastësishëm të array-ve dhe vargjeve, zgjedhjen e çeljeve të rastësishme të array-ve, përdorimin e njëkohshëm të disa gjeneruesve me qëndrim të pavarur. $rng = $is_production ? new Random\Engine\Secure() : new Random\Engine\Mt19937(1234); $randomizer = new Random\Randomizer($rng); $randomizer->shuffleString('foobar');
- Është realizuar një transformim të regjistrit të simboleve të pavaruara nga lokaliteti. Funksionet si strtolower() dhe strtoupper() tani gjithmonë transformojnë regjistrin e simboleve në intervalin ASCII, siç është vendosur në lokalitetin "C".
- Janë shtuar funksione të reja: 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.
- Janë shtuar metoda të reja: mysqli::execute_query, ZipArchive::getStreamIndex, ZipArchive::getStreamName, ZipArchive::clearError, ReflectionFunction::isAnonymous, ReflectionMethod::hasPrototype.
- Është shpallur si e vjetruar mundësia për krijimin dinamik të pronave në klasë. Në PHP 9.0, qasja në pronat që nuk janë caktuar fillimisht në klasë do të shkaktojë një gabim (ErrorException). Klasat që ofrojnë metodat __get dhe __set për krijimin e pronave, ose pronat dinamike në stdClass do të vazhdojnë të funksionojnë pa ndryshime, mbështetje do të anullohet vetëm për qasjen e paqartë në pronat që nuk ekzistojnë për të mbrojtur zhvilluesin nga gabimet e fshehura. Për të ruajtur funksionimin e kodit të vjetër, është propozuar atributi "#[AllowDynamicProperties]", që lejon përdorimin e pronave dinamike.
- Është shpallur e vjetruar mundësia për vendosjen e vlerave të variablave në vargje përmes shprehjeve «${var}» dhe ${(var)}». Mbështetje për vendosjet e zakonshme «{$var}» dhe «$var» është ruajtur. Për shembull: «Hello {$world}»; OK «Hello $world»; OK «Hello ${world}»; E vjetruar: Përdorimi i ${} në vargje është i vjetruar
- Është shpallur e vjetruar pjesërisht mbështetja për objektet e thirrjes (callable), të cilat mund të thirren përmes «call_user_func($callable)», por nuk mbështesin thirrjen në formën «$callable()»: «self::method» «parent::method» «static::method» [«self», «method»] [«parent», «method»] [«static», «method»] [«Foo», «Bar::method»] [new Foo, «Bar::method»]
- Në cilësimet është shtuar drejtimi error_log_mode, që lejon përcaktimin e mënyrës së aksesit në logun e gabimeve.
Burimi: opennet.ru
