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

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

PHP 8.3์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ:

  • ํด๋ž˜์Šค ๋ณต์ œ ์ค‘์— "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"๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. . $๋ฐฐ์—ด = []; $๋ฐฐ์—ด[-5] = 'a'; $๋ฐฐ์—ด[] = 'b'; var_export($array); // ๋ฐฐ์—ด์ด์—ˆ์Œ(-5 => 'a', 0 => 'b') // ๋ฐฐ์—ด์ด ๋จ(-5 => 'a', -4 => 'b')
  • ์ฝ๊ธฐ ์ „์šฉ ๋ชจ๋“œ์—์„œ ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค: $class = new readonly class { public function __construct( public string $foo = 'bar', ) {} };
  • ๋””์ฝ”๋”ฉ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฌธ์ž์—ด์ด JSON ํ˜•์‹์ธ์ง€ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” json_validate() ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. json_validate(string $json, int $length = 512, int $flags = 0): bool
  • ์˜์‚ฌ ๋‚œ์ˆ˜ ๋ฐ ์‹œํ€€์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ณ ๊ธ‰ API๋ฅผ ์ œ๊ณตํ•˜๋Š” Randomizer ํด๋ž˜์Šค์— ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. getBytesFromString์€ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์— ์žˆ๋Š” ๋ฌธ์ž๋ฅผ ๋ฌด์ž‘์œ„ ์ˆœ์„œ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋œ ํฌ๊ธฐ์˜ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. getFloat ๋ฐ nextFloat๋Š” ์ง€์ •๋œ ๋ฒ”์œ„ ๋‚ด์— ์†ํ•˜๋Š” ์ž„์˜์˜ ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆซ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋™์  ํด๋ž˜์Šค ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์ˆ˜๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. class Foo { const BAR = 'bar'; } $์ด๋ฆ„ = '๋ฐ”'; // ์ด์ „์—๋Š” BAR ์ƒ์ˆ˜๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ ค๋ฉด Constant(Foo::class . '::' . $name); // ์ด์ œ Foo::{$name}์„ ์ง€์ •ํ•˜์„ธ์š”.
  • ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ์ž‘์—… ์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๊ฐœ๋ณ„ ์˜ˆ์™ธ(DateMalformedIntervalStringException, DateInvalidOperationException, DateRangeError) ์ƒ์„ฑ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • unserialize() ํ•จ์ˆ˜์—์„œ ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๋™์•ˆ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ unserialize()๋Š” ์ด์ œ E_NOTICE ๋Œ€์‹  E_WARNING์„ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • range() ํ•จ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ”์œ„ ๊ฒฝ๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ๋ณ€์ˆ˜์— ๊ฐœ์ฒด, ๋ฆฌ์†Œ์Šค ๋˜๋Š” ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ $step ๋งค๊ฐœ ๋ณ€์ˆ˜์— ์Œ์ˆ˜ ๊ฐ’์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ๋งค๊ฐœ ๋ณ€์ˆ˜์— ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์„ ์ง€์ •ํ•  ๋•Œ ์˜ˆ์™ธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ˆซ์ž ๋Œ€์‹  ๋ฌธ์ž์—ด์„ ์ง€์ •ํ•  ๋•Œ ๋ฌธ์ž ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: "range('5', 'z')").
  • ์ด์ œ ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ ์ƒ์†๋œ ์ •์  ์†์„ฑ์„ ์žฌ์ •์˜ํ•˜๋Š” ์ •์  ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์„ฑ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ ๋ณดํ˜ธ๋ฅผ ์œ„ํ•œ ์„ค์ •์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. zend.max_allowed_stack_size ๋ฐ zend.reserved_stack_size ์ง€์‹œ๋ฌธ์ด ini ํŒŒ์ผ์— ์ถ”๊ฐ€๋˜์–ด ์ตœ๋Œ€ ํ—ˆ์šฉ ๋ฐ ์˜ˆ์•ฝ ์Šคํƒ ํฌ๊ธฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ์ด ์†Œ์ง„๋  ๋•Œ, ์ฆ‰ zend.max_allowed_stack_size์™€ zend.reserved_stack_size ์‚ฌ์ด์˜ ์ฐจ์ด๋ณด๋‹ค ๋” ๋งŽ์ด ์Šคํƒ์ด ๊ฐ€๋“ ์ฐจ๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค(์„ธ๊ทธ๋จผํŠธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ์‹คํ–‰์ด ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค). ๊ธฐ๋ณธ์ ์œผ๋กœ zend.max_allowed_stack_size ๊ฐ’์€ 0์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค(0 - ํฌ๊ธฐ๋Š” ์ž๋™์œผ๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ์ œํ•œ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด -1๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).
  • ์ƒˆ๋กœ์šด POSIX ํ•จ์ˆ˜ posix_sysconf(), posix_pathconf(), posix_fpathconf() ๋ฐ posix_eaccess()๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • UTF-8๊ณผ ๊ฐ™์€ ๋ฉ€ํ‹ฐ๋ฐ”์ดํŠธ ์ธ์ฝ”๋”ฉ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„๋œ str_pad() ๋ฌธ์ž์—ด ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•œ mb_str_pad ํ•จ์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฉ”์†Œ๋“œ์—์„œ ํด๋กœ์ €๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ช…๋ช…๋œ ์ธ์ˆ˜๋ฅผ ํ•ด๋‹น ํด๋กœ์ €์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. $test = ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ(); $ํด๋กœ์ € = $test->๋งค์ง(...); $closure(a: '์•ˆ๋…•ํ•˜์„ธ์š”', b: '์„ธ๊ณ„');
  • ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ƒ์ˆ˜์˜ ๊ฐ€์‹œ์„ฑ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋™์ž‘์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค I { public const FOO = 'foo'; } ํด๋ž˜์Šค C๋Š” 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 ์ƒ์ˆ˜๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ $host ๋ฐ $port๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ldap_connect() ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ง€์›์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. opcache.consistency_checks ์„ค์ •์ด ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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