Π Π΅Π»ΠΈΠ· языка программирования PHP 8.3

ПослС Π³ΠΎΠ΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прСдставлСн Ρ€Π΅Π»ΠΈΠ· языка программирования PHP 8.3. Новая Π²Π΅Ρ‚ΠΊΠ° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡΠ΅Ρ€ΠΈΡŽ Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй, Π° Ρ‚Π°ΠΊΠΆΠ΅ нСсколько ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π½Π°Ρ€ΡƒΡˆΠ°ΡŽΡ‰ΠΈΡ… ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ измСнСния Π² PHP 8.3:

  • Π’ΠΎ врСмя клонирования классов прСдоставлСна Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ свойств с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ «readonly». ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ readonly-свойств допускаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ «__clone»: readonly class Post { public function __construct( public DateTime $createdAt, ) {} public function __clone() { $this->createdAt = new DateTime(); // Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ, нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ свойство «createdAt» доступно Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния. } }
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования констант с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ° Π² классах, Ρ‚ΠΈΠΏΠ°ΠΆΠ°Ρ… ΠΈ пСрСчислСниях: class Foo { const string BAR = ‘baz’; }
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° «#[Override]», ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ пСрСопрСдСляСт ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄. Π’ случаС Ссли пСрСопрСдСлСния Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ.
  • ИзмСнСна ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² качСствС индСкса массива. НапримСр, ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π² пустой массив элСмСнта с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ «-5» ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта, Ρ€Π°Π½ΡŒΡˆΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ элСмСнт сохранялся с индСксом «0», Π° начиная с вСрсии PHP 8.3 Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ с индСксом «-4». $array = []; $array[-5] = ‘a’; $array[] = ‘b’; var_export($array); // Π‘Ρ‹Π»ΠΎ array (-5 => ‘a’, 0 => ‘b’) // Π‘Ρ‚Π°Π»ΠΎ array (-5 => ‘a’, -4 => ‘b’)
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ создания Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… классов Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния: $class = new readonly class { public function __construct( public string $foo = ‘bar’, ) {} };
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° функция json_validate() для быстрой ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ соотвСтствия строки Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ JSON Π±Π΅Π· выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ дСкодирования. json_validate(string $json, int $depth = 512, int $flags = 0): bool
  • Π’ класс Randomizer, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ высокоуровнСвый API для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ псСводослучайных чисСл ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹: getBytesFromString для формирования строки Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉ Π² случайном порядкС символы, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ строкС; getFloat ΠΈ nextFloat для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ случайного числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой, ΡƒΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ извлСчСния констант, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ синтаксис динамичСских классов: class Foo { const BAR = ‘bar’; } $name = ‘BAR’; // Π Π°Π½Π΅Π΅ для извлСчСния константы BAR Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ constant(Foo::class . ‘::’ . $name); // А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ достаточно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Foo::{$name};
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° гСнСрация ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ (DateMalformedIntervalStringException, DateInvalidOperationException, DateRangeError) Π² случаС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΡ… Π² опСрациях Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Ρ‚Π°ΠΌΠΈ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ.
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΡ… Π² процСссС Ρ€Π°Π·Π±ΠΎΡ€Π° сСриализированных Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ unserialize(). Π’ случаС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ unserialize() Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹Π΄Π°Ρ‘Ρ‚ ΠΊΠΎΠ΄ E_WARNING вмСсто E_NOTICE.
  • ВнСсСны измСнСния Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ range(). ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½Π° гСнСрация ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², рСсурсов ΠΈΠ»ΠΈ массивов Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΡ… Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ $step ΠΈΠ»ΠΈ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ значСния Π² любом ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅. ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ Π²Ρ‹Π²ΠΎΠ΄ списка символов ΠΏΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ строк вмСсто чисСл (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, «range(‘5’, ‘z’)»).
  • ИзмСнСно ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°ΠΆΠ΅ΠΉ со статичСскими свойствами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ статичСскиС свойства, унаслСдованныС ΠΈΠ· Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ настройки для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ пСрСполнСния стСка. Π’ ini-Ρ„Π°ΠΉΠ» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ zend.max_allowed_stack_size ΠΈ zend.reserved_stack_size, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ максимально Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½Π½Ρ‹ΠΉ ΠΈ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ стСка. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒΡΡ ошибкой ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΊ ΠΈΡΡ‡Π΅Ρ€ΠΏΠ°Π½ΠΈΡŽ стСка, ΠΊΠΎΠ³Π΄Π° стСк Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ большС, Ρ‡Π΅ΠΌ Π½Π° Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ значСниями zend.max_allowed_stack_size ΠΈ zend.reserved_stack_size (Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ остановлСно Π½Π΅ доводя ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π΄ΠΎ возникновСния segmentation fault). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ zend.max_allowed_stack_size выставлСно Π² 0 (0 — Ρ€Π°Π·ΠΌΠ΅Ρ€ опрСдСляСтся автоматичСски, для ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ограничСния ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ -1).
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ POSIX-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ posix_sysconf(), posix_pathconf(), posix_fpathconf() ΠΈ posix_eaccess().
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° функция mb_str_pad, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ собой Π°Π½Π°Π»ΠΎΠ³ строковой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ str_pad(), рассчитанный Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΌΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ UTF-8.
  • Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ созданиС Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠΉ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² эти замыкания. $test = new Test(); $closure = $test->magic(…); $closure(a: ‘hello’, b: ‘world’);
  • ИзмСнСно ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ видимости констант Π² интСрфСйсах. interface I { public const FOO = ‘foo’; } class C implements I { private const FOO = ‘foo’; }
  • Π Π°ΡΡˆΠΈΡ€Π΅Π½Ρ‹ возмоТности Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ array_sum(), array_product(), posix_getrlimit(), gc_status(), class_alias(), mysqli_poll(), array_pad() ΠΈ proc_get_status().
  • ОбъявлСна ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния $widths Π² mb_strimwidth(). Π£Π΄Π°Π»Π΅Π½Π° константа NumberFormatter::TYPE_CURRENCY. ΠŸΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ldap_connect() с двумя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ $host ΠΈ $port. Π£Π΄Π°Π»Π΅Π½Π° настройка opcache.consistency_checks.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ