Pēc gada izstrādes tika prezentēta PHP 8.3 programmēšanas valodas izlaidums. Jaunajā filiālē ir iekļauta virkne jaunu funkciju, kā arī vairākas izmaiņas, kas traucē saderību.
Galvenās izmaiņas PHP 8.3 versijā:
- Klonējot klases, tagad ir iespējams atkārtoti inicializēt īpašības ar atribūtu "readonly". Tikai lasāmu īpašību pārrakstīšana ir atļauta tikai funkcijas "__clone" ietvaros: readonly class Post { public function __construct( public DateTime $createdAt, ) {} public function __clone() { $this->createdAt = new DateTime(); // atļauts, pat ja īpašība "createdAt" ir tikai lasāma. } }
- Tagad ir pieejama iespēja izmantot konstantes ar tipa specifikāciju klasēs, īpašībās un uzskaitījumos: class Foo { const string BAR = 'baz'; }
- Pievienots atbalsts atribūtam "#[Override]", kas ļauj izstrādātājam informēt interpretētāju, ka atzīmēta metode ignorē vecāku metodi. Ja ignorēšanas nav, interpretētājs ģenerēs kļūdu.
- Ir mainīta negatīvu vērtību apstrāde kā masīva indeksiem. Piemēram, pievienojot elementu ar indeksu "-5" tukšam masīvam un pēc tam pievienojot vēl vienu elementu, otrais elements iepriekš tika saglabāts ar indeksu "0", bet, sākot ar PHP 8.3, tas tiks saglabāts ar indeksu "-4". $array = []; $array[-5] = 'a'; $array[] = 'b'; var_export($array); // Bija masīvs (-5 => 'a', 0 => 'b') // Kļuva par masīvu (-5 => 'a', -4 => 'b')
- Pievienota iespēja veidot anonīmas klases tikai lasīšanas režīmā: $class = new readonly class { public function __construct( public string $foo = 'bar', ) {} };
- Pievienota funkcija json_validate(), lai ātri pārbaudītu, vai virkne atbilst JSON formātam, neveicot dekodēšanas darbības. json_validate(string $json, int $depth = 512, int $flags = 0): bool
- Randomizer klasei ir pievienotas jaunas metodes, kas nodrošina augsta līmeņa API pseido-nejaušu skaitļu un secību ģenerēšanai: getBytesFromString noteikta izmēra virknes ģenerēšanai, kas nejauši atlasa rakstzīmes no citas virknes; un getFloat un nextFloat nejauša peldošā komata skaitļa ģenerēšanai noteiktā diapazonā.
- Pievienota iespēja iegūt konstantes, izmantojot dinamisko klases sintaksi: class Foo { const BAR = 'bar'; } $name = 'BAR'; // Iepriekš, lai iegūtu BAR konstanti, bija jāizsauc constant(Foo::class . '::' . $name); // Tagad tikai jānorāda Foo::{$name};
- Pievienota atsevišķu izņēmumu ģenerēšana (DateMalformedIntervalStringException, DateInvalidOperationException, DateRangeError) problēmu gadījumā, veicot darbības ar datumiem un laikiem.
- Uzlabota kļūdu apstrāde, kas rodas, parsējot serializētus datus funkcijā unserialize(). Ja rodas problēmas, unserialize() tagad atgriež kodu E_WARNING, nevis E_NOTICE.
- Izmaiņas ir veiktas funkcijā range(). Tagad tiek izmests izņēmums, mēģinot nodot objektus, resursus vai masīvus mainīgajos, kas nosaka diapazona robežas, kā arī norādot negatīvu vērtību parametrā $step vai nedefinētu vērtību jebkurā parametrā. Norādot virknes skaitļu vietā (piemēram, "range('5', 'z')").
- Iezīmju ar statiskām īpašībām uzvedība ir mainīta, tāpēc tās tagad ignorē no vecākklases mantotās statiskās īpašības.
- Pievienoti kaudzes pārpildes aizsardzības iestatījumi. INI failam ir pievienotas direktīvas zend.max_allowed_stack_size un zend.reserved_stack_size. Šīs direktīvas nosaka maksimāli pieļaujamos un rezervētos kaudzes izmērus. Programma pārtrauks darbību ar kļūdu, tuvojoties kaudzes izsīkumam, ja kaudze būs piepildīta vairāk nekā starpība starp zend.max_allowed_stack_size un zend.reserved_stack_size vērtībām (izpilde tiks apturēta pirms segmentācijas kļūdas rašanās). Pēc noklusējuma zend.max_allowed_stack_size ir iestatīts uz 0 (0 nozīmē, ka izmērs tiek noteikts automātiski; var iestatīt -1, lai atspējotu ierobežojumu).
- Pievienotas jaunas POSIX funkcijas posix_sysconf(), posix_pathconf(), posix_fpathconf() un posix_eaccess().
- Pievienota funkcija mb_str_pad, kas ir str_pad() virknes funkcijas analogs un paredzēta darbam ar vairāku baitu kodējumiem, piemēram, UTF-8.
- Ir atļauts veidot slēgumus no metodēm un nodot šiem slēgumiem nosauktus argumentus. $test = new Test(); $closure = $test->magic(…); $closure(a: 'hello', b: 'world');
- Mainīta uzvedība, apstrādājot konstantu redzamību saskarnēs. interface I { public const FOO = 'foo'; } C klase implements I { private const FOO = 'foo'; }
- Funkciju array_sum(), array_product(), posix_getrlimit(), gc_status(), class_alias(), mysqli_poll(), array_pad() un proc_get_status() iespējas ir paplašinātas.
- Iespēja nodot negatīvu $widths vērtību funkcijai mb_strimwidth() vairs netiek atbalstīta. Konstante NumberFormatter::TYPE_CURRENCY ir noņemta. Atbalsts ldap_connect() izsaukšanai ar diviem parametriem — $host un $port — vairs netiek atbalstīts. Iestatījums opcache.consistency_checks ir noņemts.
Avots: opennet.ru
