PHP 8.2 ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฆด๋ฆฌ์Šค

8.2๋…„๊ฐ„์˜ ๊ฐœ๋ฐœ ๋์— PHP XNUMX ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋ถ„๊ธฐ์—๋Š” ์ผ๋ จ์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๊ณผ ํ˜ธํ™˜์„ฑ์„ ์†์ƒ์‹œํ‚ค๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

PHP 8.2์˜ ์ฃผ์š” ๊ฐœ์„  ์‚ฌํ•ญ:

  • ํด๋ž˜์Šค๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค์˜ ์†์„ฑ์€ ํ•œ ๋ฒˆ๋งŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ ํ›„์—๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ๊ฐœ๋ณ„ ํด๋ž˜์Šค ์†์„ฑ์„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ์ด์ œ ๋ชจ๋“  ํด๋ž˜์Šค ์†์„ฑ์— ๋Œ€ํ•ด ์ด ๋ชจ๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ์ผค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์ˆ˜์ค€์—์„œ "readonly" ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•˜๋ฉด ํด๋ž˜์Šค์— ์†์„ฑ์„ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์ „์šฉ ํด๋ž˜์Šค Post { public function __construct( public string $title, public Author $author, ) {} } $post = new Post(/* โ€ฆ */); $post->unknown = '์ž˜๋ชป๋จ'; // ์˜ค๋ฅ˜: ๋™์  ์†์„ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Post::$unknown
  • ํ•˜๋‚˜์˜ ์œ ํšจํ•œ ๊ฐ’๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ค๋ฅ˜ ์ข…๋ฃŒ ํ”Œ๋ž˜๊ทธ ๋˜๋Š” ๋นˆ ๊ฐ’์ด ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ณ„๋„์˜ ์œ ํ˜• "true", "false" ๋ฐ "null"์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” "true", "false" ๋ฐ "null"์„ ๋‹ค๋ฅธ ์œ ํ˜•(์˜ˆ: "string|false")๊ณผ ๊ฒฐํ•ฉํ•ด์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ์ด์ œ๋Š” ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. function AlwaysFalse(): false { return false ; }
  • ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์Šคํƒ ์ถ”์  ์ถœ๋ ฅ์—์„œ โ€‹โ€‹๋ฏผ๊ฐํ•œ ์„ค์ •์„ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋ฌธ์ œ๋ฅผ ์ถ”์ ํ•˜๊ณ  ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์•Œ๋ฆฌ๋Š” ํƒ€์‚ฌ ์„œ๋น„์Šค์— ์ž๋™์œผ๋กœ ์ „์†ก๋˜๋Š” ๊ฒฝ์šฐ ํŠน์ • ์ •๋ณด๋ฅผ ์ž˜๋ผ๋‚ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž ์ด๋ฆ„, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ์ถ”์ ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. function test( $foo, #[\SensitiveParameter] $password, $baz ) { throw new Exception('์˜ค๋ฅ˜'); } test('foo', '๋น„๋ฐ€๋ฒˆํ˜ธ', 'baz'); Fatal error: Uncaught Exception: Error in test.php:8 Stack trace: #0 test.php(11): test('foo', Object(SensitiveParameterValue), 'baz') #1 {main}์ด test.php์—์„œ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜จ๋ผ์ธ 8
  • ํŠน์„ฑ(ํŠน์„ฑ, ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜)์—์„œ ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์„ฑ์— ์ •์˜๋œ ์ƒ์ˆ˜๋Š” ํ•ด๋‹น ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํŠน์„ฑ ์ด๋ฆ„์„ ํ†ตํ•ด์„œ๋Š” ์•„๋‹˜). trait Foo { public const CONSTANT = 1; ๊ณต์šฉ ํ•จ์ˆ˜ bar(): int { return self::CONSTANT; // ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜ } } class Bar { use Foo; } var_dump(๋ฐ”::์ƒ์ˆ˜); // 1
  • Disjunctive Normal Form(DNF, Disjunctive Normal Form)์œผ๋กœ ์œ ํ˜•์„ ์ง€์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์œ ํ˜•์˜ ํ•ฉ์ง‘ํ•ฉ(๋‘˜ ์ด์ƒ์˜ ์œ ํ˜•์˜ ์ง‘ํ•ฉ)๊ณผ ์œ ํ˜•์˜ ๊ต์ง‘ํ•ฉ(๊ฐ’์ด ์—ฌ๋Ÿฌ ๊ฐœ์— ์†ํ•˜๋Š” ์œ ํ˜•)์„ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์„ ๋™์‹œ์—). class Foo { ๊ณต๊ฐœ ํ•จ์ˆ˜ bar((A&B)|null $entity) { if ($entity === null) { return null; } $entity๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. } }
  • ์˜์‚ฌ ๋‚œ์ˆ˜ ๋ฐ ์‹œํ€€์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜ ๋ฐ ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋œ ์ƒˆ๋กœ์šด ํ™•์žฅ "Random"์ด ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“ˆ์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ , ์•”ํ˜ธํ™”์— ์‚ฌ์šฉํ•˜๊ธฐ์— ์ ํ•ฉํ•œ ์—”์ง„์„ ํฌํ•จํ•˜์—ฌ ์˜์‚ฌ ๋‚œ์ˆ˜ ์ƒ์„ฑ์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ์—”์ง„์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉฐ, ๋ฐฐ์—ด๊ณผ ๋ฌธ์ž์—ด์„ ๋ฌด์ž‘์œ„๋กœ ํ˜ผํ•ฉํ•˜๊ณ , ๋ฌด์ž‘์œ„ ๋ฐฐ์—ด ํ‚ค๋ฅผ ์„ ํƒํ•˜๋Š” ๋“ฑ์˜ ๋ณด์กฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ๋งŒ์˜ ๋…๋ฆฝ์ ์ธ ์ƒํƒœ๋กœ ์—ฌ๋Ÿฌ ๋ฐœ์ „๊ธฐ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. $rng = $is_production ? ์ƒˆ๋กœ์šด Random\Engine\Secure() : ์ƒˆ๋กœ์šด Random\Engine\Mt19937(1234); $randomizer = ์ƒˆ๋กœ์šด Random\Randomizer($rng); $randomizer->shuffleString('foobar');
  • ๋กœ์ผ€์ผ ๋…๋ฆฝ์ ์ธ ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ™˜์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. strtolower() ๋ฐ strtoupper()์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋Š” ์ด์ œ ๋กœ์ผ€์ผ์„ "C"๋กœ ์„ค์ •ํ•  ๋•Œ์™€ ๊ฐ™์ด ํ•ญ์ƒ ASCII ๋ฒ”์œ„์˜ ๋ฌธ์ž ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€: mysqli_execute_query, cur_upkeep, memory_reset_peak_usage, ini_parse_quantity, libxml_get_external_entity_loader, ๋‚˜ํŠธ๋ฅจ_crypto_stream_xchacha20_xor_ic, openssl_cipher_key_length.
  • ์ƒˆ๋กœ์šด ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€: mysqli::execute_query, ZipArchive::getStreamIndex, ZipArchive::getStreamName, ZipArchive::clearError, ReflectionFunction::isAnonymous, ReflectionMethod::hasPrototype.
  • ํด๋ž˜์Šค์—์„œ ์†์„ฑ์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. PHP 9.0์—์„œ๋Š” ํด๋ž˜์Šค์— ์ฒ˜์Œ์— ์ •์˜๋˜์ง€ ์•Š์€ ์†์„ฑ์— ์•ก์„ธ์Šคํ•˜๋ฉด ์˜ค๋ฅ˜(ErrorException)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์†์„ฑ ์ƒ์„ฑ์„ ์œ„ํ•ด __get ๋ฐ __set ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค ๋˜๋Š” stdClass์˜ ๋™์  ์†์„ฑ์€ ๋ณ€๊ฒฝ ์—†์ด ๊ณ„์† ์ž‘๋™ํ•˜๋ฉฐ, ์ˆจ๊ฒจ์ง„ ๋ฒ„๊ทธ๋กœ๋ถ€ํ„ฐ ๊ฐœ๋ฐœ์ž๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์†์„ฑ์„ ์‚ฌ์šฉํ•œ ์•”์‹œ์  ์ž‘์—…๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์ด์ „ ์ฝ”๋“œ์˜ ์ž‘์—…์„ ๋ณด์กดํ•˜๊ธฐ ์œ„ํ•ด ๋™์  ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” "#[AllowDynamicProperties]" ์†์„ฑ์ด ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • "${var}" ๋ฐ ${(var)}" ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” "{$var}" ๋ฐ "$var" ๋Œ€์ฒด์— ๋Œ€ํ•œ ์ง€์›์ด ์œ ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: "Hello {$world}"; ํ™•์ธ "Hello $world"; OK "์•ˆ๋…•ํ•˜์„ธ์š” ${world}"; ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ: ๋ฌธ์ž์—ด์—์„œ ${} ์‚ฌ์šฉ์ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ
  • "call_user_func($callable)"์„ ํ†ตํ•ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ ์œผ๋กœ ์ง€์›๋˜๋Š” ์ฝœ๋Ÿฌ๋ธ”์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ "$callable()": "self::method" "parent::method" "static :: ํ˜•์‹์˜ ํ˜ธ์ถœ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•" ["์ž์‹ ", "๋ฐฉ๋ฒ•"] ["๋ถ€๋ชจ", "๋ฐฉ๋ฒ•"] ["์ •์ ", "๋ฐฉ๋ฒ•"] ["Foo", "Bar::๋ฐฉ๋ฒ•"] [์ƒˆ๋กœ์šด Foo, "๋ฐ”: :๋ฐฉ๋ฒ• "]
  • error_log_mode ์ง€์‹œ๋ฌธ์ด ์„ค์ •์— ์ถ”๊ฐ€๋˜์–ด ์˜ค๋ฅ˜ ๋กœ๊ทธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๋ชจ๋“œ๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€