ΠΠ°Ρ‡Π°Π»ΠΎΡΡŒ Π°Π»ΡŒΡ„Π°-тСстированиС PHP 8.2

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Π»ΡŒΡ„Π°-выпуск Π½ΠΎΠ²ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΈ языка программирования PHP 8.2. Π Π΅Π»ΠΈΠ· Π½Π°ΠΌΠ΅Ρ‡Π΅Π½ Π½Π° 24 ноября. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Π½ΠΎΠ²ΡˆΠ΅ΡΡ‚Π²Π°, ΡƒΠΆΠ΅ доступныС для тСстирования ΠΈΠ»ΠΈ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² PHP 8.2:

  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ «false» ΠΈ «null», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для возвращСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ с ошибкой ΠΈΠ»ΠΈ пустого значСния. Π Π°Π½Π΅Π΅ «false» ΠΈ «null» ΠΌΠΎΠ³Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² связкС с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, «string|false»), Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ: function alwaysFalse(): false { return false; }
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΈ класса доступным Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния. Бвойства Π² ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… классах ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, послС Ρ‡Π΅Π³ΠΎ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ доступны для измСнСния. Π Π°Π½Π΅Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠΌΠ΅Ρ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ свойства класса, Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ для всСх свойств класса. Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ„Π»Π°Π³Π° «readonly» Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ класса Ρ‚Π°ΠΊΠΆΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ динамичСскоС Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ свойств Π² класс. readonly class Post { public function __construct( public string $title, public Author $author, ) {} } $post = new Post(/* … */); $post->unknown = ‘wrong’; // Error: Cannot create dynamic property Post::$unknown
  • ОбъявлСна ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ динамичСского создания свойств Π² классС (ΠΊΠ°ΠΊ «post->unknown» Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅). Π’ PHP 9.0 ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ свойствам, ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ Π² классС, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ошибкС (ErrorException). ΠšΠ»Π°ΡΡΡ‹, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ __get ΠΈ __set для создания свойств, ΠΈΠ»ΠΈ динамичСскиС свойства Π² stdClass ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, прСкратится ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСявной Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ свойствами для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΎΡ‚ скрытых ошибок. Для сохранСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ старого ΠΊΠΎΠ΄Π° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ «#[AllowDynamicProperties]», Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰ΠΈΠΉ использованиС динамичСских свойств.
  • ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² Π΄Π°Π½Π½Ρ‹Ρ… трассировки стСка, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π²ΠΎ врСмя ошибки. Π’Ρ‹Ρ€Π΅Π·Π°Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠ³Π΄Π° свСдСния ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΡ… ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… автоматичСски Π½Π°ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² сторонниС сСрвисы, ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎ Π½ΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· трассировки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния. 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
  • ОбъявлСна ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ подстановки Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² строки ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ «${var}» ΠΈ ${(var)}». ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… подстановок «{$var}» ΠΈ «$var» сохранСна. НапримСр: «Hello {$world}»; OK «Hello $world»; OK «Hello ${world}»; Deprecated: Using ${} in strings is deprecated
  • ΠžΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌΠΈ частично ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (callable), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹ Ρ‡Π΅Ρ€Π΅Π· «call_user_func($callable)», Π½ΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π²Ρ‹Π·ΠΎΠ² Π² Ρ„ΠΎΡ€ΠΌΠ΅ «$callable()»: «self::method» «parent::method» «static::method» [«self», «method»] [«parent», «method»] [«static», «method»] [«Foo», «Bar::method»] [new Foo, «Bar::method»]
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ нСзависимоС ΠΎΡ‚ Π»ΠΎΠΊΠ°Π»ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ рСгистра символов. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ strtolower() ΠΈ strtoupper(), Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ всСгда ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ рСгистр символов Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ASCII ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ выставлСнии Π»ΠΎΠΊΠ°Π»ΠΈ «Π‘».

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

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