αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž’αžΆαž›αŸ‹αž αŸ’αžœαžΆαž“αŸƒ PHP 8.2 αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž αžΎαž™αŸ”

αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž’αžΆαž›αŸ‹αž αŸ’αžœαžΆαžŠαŸ†αž”αžΌαž„αž“αŸƒαžŸαžΆαžαžΆαžαŸ’αž˜αžΈαž“αŸƒαž—αžΆαžŸαžΆαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ PHP 8.2 αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αŸ” αž€αžΆαžšβ€‹αž…αŸαž‰β€‹αž•αŸ’αžŸαžΆαž™β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž‚αŸ’αžšαŸ„αž„β€‹αž’αŸ’αžœαžΎβ€‹αž“αŸ…β€‹αžαŸ’αž„αŸƒβ€‹αž‘αžΈ ្ៀ αžαŸ‚β€‹αžœαž·αž…αŸ’αž†αž·αž€αžΆαŸ” αž€αžΆαžšαž…αŸ’αž“αŸƒαž”αŸ’αžšαžŒαž·αžαžŸαŸ†αžαžΆαž“αŸ‹αŸ—αžŠαŸ‚αž›αž˜αžΆαž“αžšαž½αž…αž αžΎαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„ αž¬αž‚αŸ’αžšαŸ„αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„ PHP 24αŸ–

  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Β«falseΒ» ΠΈ Β«nullΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для возвращСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ с ошибкой ΠΈΠ»ΠΈ пустого значСния. Π Π°Π½Π΅Π΅ Β«falseΒ» ΠΈ Β«nullΒ» ΠΌΠΎΠ³Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² связкС с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Β«string|falseΒ»), Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ: function alwaysFalse(): false { return false; }
  • αž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαŸ’αž“αžΆαž€αŸ‹αžαžΆαž”αžΆαž“αžαŸ‚αž’αžΆαž“αŸ” αž›αž€αŸ’αžαžŽαžŸαž˜αŸ’αž”αžαŸ’αžαž·αž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ’αž“αžΆαž€αŸ‹αž”αŸ‚αž”αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαŸ‚αž˜αŸ’αžαž„αž‚αžαŸ‹ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αž–αž½αž€αžœαžΆαž˜αž·αž“αž’αžΆαž…αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αžΆαž“αž‘αŸαŸ” αž–αžΈαž˜αž»αž“ αž›αž€αŸ’αžαžŽαžŸαž˜αŸ’αž”αžαŸ’αžαž·αžαŸ’αž“αžΆαž€αŸ‹αž“αžΈαž˜αž½αž™αŸ—αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆαž”αžΆαž“αžαŸ‚αž’αžΆαž“ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž₯αž‘αžΌαžœαž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αž”αžΎαž€αžšαž”αŸ€αž”αž“αŸαŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž›αž€αŸ’αžαžŽαžŸαž˜αŸ’αž”αžαŸ’αžαž·αžαŸ’αž“αžΆαž€αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž€αŸ’αž“αž»αž„αž–αŸαž›αžαŸ‚αž˜αž½αž™αŸ” αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž‘αž„αŸ‹ "αž”αžΆαž“αžαŸ‚αž’αžΆαž“" αž“αŸ…αž€αž˜αŸ’αžšαž·αžαžαŸ’αž“αžΆαž€αŸ‹αž€αŸαžšαžΆαžšαžΆαŸ†αž„αž›αž€αŸ’αžαžŽαŸˆαžŸαž˜αŸ’αž”αžαŸ’αžαž·αž–αžΈαž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αžαžΆαž˜αžœαž“αŸ’αžαž‘αŸ…αžαŸ’αž“αžΆαž€αŸ‹αž•αž„αžŠαŸ‚αžšαŸ” readonly class Post { public function __construct( public string $title, public Author $author, ) {} } $post = new Post(/* … */); $post->unknown = 'ខុស'; // αž€αŸ†αž αž»αžŸαŸ– αž˜αž·αž“αž’αžΆαž…αž”αž„αŸ’αž€αžΎαž dynamic property Post::$unknown
  • ОбъявлСна ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ динамичСского создания свойств Π² классС (ΠΊΠ°ΠΊ Β«post->unknownΒ» Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅). Π’ PHP 9.0 ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ свойствам, ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ Π² классС, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ошибкС (ErrorException). ΠšΠ»Π°ΡΡΡ‹, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ __get ΠΈ __set для создания свойств, ΠΈΠ»ΠΈ динамичСскиС свойства Π² stdClass ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, прСкратится ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСявной Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ свойствами для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΎΡ‚ скрытых ошибок. Для сохранСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ старого ΠΊΠΎΠ΄Π° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Β«#[AllowDynamicProperties]Β», Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰ΠΈΠΉ использованиС динамичСских свойств.
  • αž•αŸ’αžαž›αŸ‹αž›αž‘αŸ’αž’αž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαžαŸ’αžšαž„αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžšαžŸαžΎαž”αž“αŸ…αž€αŸ’αž“αž»αž„αž›αž‘αŸ’αž’αž•αž›αžŠαžΆαž“αž‡αž„αŸ‹αž€αŸ†αž‘αž»αž„αž–αŸαž›αž˜αžΆαž“αž€αŸ†αž αž»αžŸαŸ” αž€αžΆαžšαž€αžΆαžαŸ‹αž…αŸαž‰αž–αŸαžαŸŒαž˜αžΆαž“αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž’αžΆαž…αž‡αžΆαž€αžΆαžšαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž–αŸαžαŸŒαž˜αžΆαž“αž’αŸ†αž–αžΈαž€αŸ†αž αž»αžŸαžŠαŸ‚αž›αž€αžΎαžαž‘αžΎαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž—αžΆαž‚αžΈαž‘αžΈαž”αžΈαžŠαŸ‚αž›αžαžΆαž˜αžŠαžΆαž“αž”αž‰αŸ’αž αžΆ αž“αž·αž„αž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αžŠαž›αŸ‹αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž’αŸ†αž–αžΈαž–αž½αž€αž‚αŸαŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž’αŸ’αž“αž€αž’αžΆαž…αžŠαž€αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŠαŸ‚αž›αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αžˆαŸ’αž˜αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹ αž“αž·αž„αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αž–αžΈαž€αžΆαžšαžαžΆαž˜αžŠαžΆαž“αŸ” αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž˜αž»αžαž„αžΆαžš ($foo, #[\SensitiveParameter] $password, $baz) { throw new Exception('Error'); } test('foo', 'password', 'baz'); αž€αŸ†αž αž»αžŸαž’αŸ’αž„αž“αŸ‹αž’αŸ’αž„αžšαŸ– Uncaught Exception: Error in test.php:8 Stack track: #0 test.php(11): test('foo', Object(SensitiveParameterValue), 'baz') #1 {main} αž”αŸ„αŸ‡αž…αŸ„αž›αž€αŸ’αž“αž»αž„ test.php αž“αŸ…αž›αžΎαž”αž“αŸ’αž‘αžΆαžαŸ‹ 8
  • αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž‡αŸ†αž“αž½αžŸαžαž˜αŸ’αž›αŸƒαž’αžαŸαžšαž‘αŸ…αž‡αžΆαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αž“αŸ’αžŸαŸ„αž˜ "${var}" αž“αž·αž„ ${(var)} αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžŠαž·αžŸαŸαž’αŸ” αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‡αŸ†αž“αž½αžŸ "{$var}" αž“αž·αž„ "$var" αžŠαŸ‚αž›αž”αŸ’αžšαžΎαž‡αžΆαž‘αžΌαž‘αŸ…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αŸ” αž§αž‘αžΆαž αžšαžŽαŸαŸ– "αž‡αŸ†αžšαžΆαž”αžŸαž½αžš {$world}"; αž™αž›αŸ‹αž–αŸ’αžšαž˜ "αž‡αŸ†αžšαžΆαž”αžŸαž½αžš $ world"; αž™αž›αŸ‹αž–αŸ’αžšαž˜ "αž‡αŸ†αžšαžΆαž”αžŸαž½αžš ${world}"; αž”αžŠαž·αžŸαŸαž’αŸ– αž€αžΆαžšαž”αŸ’αžšαžΎ ${} αž€αŸ’αž“αž»αž„αžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžŠαž·αžŸαŸαž’
  • αž”αžΆαž“αž”αžŠαž·αžŸαŸαž’αž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αžŠαŸ‚αž›αž‚αžΆαŸ†αž‘αŸ’αžšαžŠαŸ„αž™αž•αŸ’αž“αŸ‚αž€αžŠαŸ‚αž›αž’αžΆαž…αž αŸ…αž”αžΆαž“αžαžΆαž˜αžšαž™αŸˆ "call_user_func($callable)" αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž·αž“αž‚αžΆαŸ†αž‘αŸ’αžšαž€αžΆαžšαž αŸ…αžαžΆαž˜αž‘αž˜αŸ’αžšαž„αŸ‹ "$callable()": "self::method" "parent::method" "static" ::method "["αžαŸ’αž›αž½αž“αž―αž„", "αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž"] ["αžͺαž–αž»αž€αž˜αŸ’αžαžΆαž™", "αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž"] ["αž‹αž·αžαž·αžœαž“αŸ’αž", "αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž"] ["αž αŸ’αžœαžΌ", "αžšαž”αžΆαžš::αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž"] [Foo αžαŸ’αž˜αžΈ, "αžšαž”αžΆαžš: :αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž" ]
  • αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž”αŸ†αž”αŸ’αž›αŸ‚αž„αž€αžšαžŽαžΈαž―αž€αžšαžΆαž‡αŸ’αž™αž€αŸ’αž“αž»αž„αžαŸ†αž”αž“αŸ‹αŸ” αž˜αž»αžαž„αžΆαžšαžŠαžΌαž…αž‡αžΆ strtolower() αž“αž·αž„ strtoupper() αž₯αž‘αžΌαžœαž“αŸαŸ‡αžαŸ‚αž„αžαŸ‚αž”αŸ†αž”αŸ’αž›αŸ‚αž„αž€αžšαžŽαžΈαžαž½αž’αž€αŸ’αžŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž‡αž½αžš ASCII αžŠαžΌαž…αž‡αžΆαž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ "C" αŸ”

αž”αŸ’αžšαž—αž–: opennet.ru

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹