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

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

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

  • ์—ด๊ฑฐ์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด์ œ ๋‹ค์Œ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. enum Status { case Pending; ์ผ€์ด์Šค ํ™œ์„ฑ; ์‚ฌ๋ก€๊ฐ€ ๋ณด๊ด€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // โ€ฆ } } $post->setStatus(Status::Active);
  • ๋‚ฎ์€ ์ˆ˜์ค€์—์„œ ์‹คํ–‰ ์Šค๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Fibers๋ผ๋Š” ๊ฒฝ๋Ÿ‰ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Amphp ๋ฐ ReactPHP ํ”„๋ ˆ์ž„์›Œํฌ์— Fiber ์ง€์›์ด ์ถ”๊ฐ€๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. $fibre = new Fiber(function (): void { $valueAfterResuming = Fiber::ํ˜„์ˆ˜๋ง‰('์ผ์‹œ ์ค‘๋‹จ ํ›„'); // ... }); $valueAfterSuspending = $์„ฌ์œ ->์‹œ์ž‘(); $์„ฌ์œ ->resume('์žฌ๊ฐœ ํ›„');
  • ๊ฐ์ฒด ์ฝ”๋“œ ์บ์‹œ(opcache) ๊ตฌํ˜„์ด ๊ฐœ์„ ๋˜์–ด ํด๋ž˜์Šค ์ƒ์†์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์บ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์ผ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ 5~8% ํ–ฅ์ƒํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐํƒ€ ์ตœ์ ํ™”์—๋Š” JIT ์ž‘์—… ์ตœ์ ํ™”, ARM64 ์•„ํ‚คํ…์ฒ˜(AArch64)์— ๋Œ€ํ•œ JIT ์ง€์› ๊ตฌํ˜„, ์ด๋ฆ„ ํ™•์ธ ๊ฐ€์†ํ™”, timelib ๋ฐ ext/date ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ตœ์ ํ™”, ์ง๋ ฌํ™” ๋ฐ ์—ญ์ง๋ ฌํ™” ์„ฑ๋Šฅ ํ–ฅ์ƒ, get_declared_classes(),Explode() ์ตœ์ ํ™”๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. , strtr() ํ•จ์ˆ˜, strnatcmp(), dechex(). ์ผ๋ฐ˜์ ์œผ๋กœ Symfony Demo์˜ ์„ฑ๋Šฅ์€ 23.0%, WordPress์˜ ๊ฒฝ์šฐ 3.5% ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒˆ ๋ฐฐ์—ด์„ ์ •์˜ํ•  ๋•Œ ๊ธฐ์กด ๋ฐฐ์—ด์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด "...$var" ๋‚ด๋ถ€์˜ ์••์ถ• ํ’€๊ธฐ ์—ฐ์‚ฐ์ž๊ฐ€ ๋ฌธ์ž์—ด ํ‚ค๋ฅผ ์ง€์›ํ•˜๋„๋ก ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์ด์ „์—๋Š” ๋””์ง€ํ„ธ ์‹๋ณ„์ž๋งŒ ์ง€์›๋˜์—ˆ์Šต๋‹ˆ๋‹ค). ์˜ˆ๋ฅผ ๋“ค์–ด ์ด์ œ ์ฝ”๋“œ์—์„œ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. $array1 = [โ€œaโ€ => 1]; $array2 = ["b" => 2]; $array = [โ€œaโ€ => 0, โ€ฆ$array1, โ€ฆ$array2]; var_dump($array); // ["a" => 1, "b" => 2]
  • ํ•จ์ˆ˜ ์ •์˜์—์„œ ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜๋‚˜ ์ธ์ˆ˜ ์†์„ฑ๊ณผ ๊ฐ™์€ ์ดˆ๊ธฐํ™” ํ”„๋กœ๊ทธ๋žจ์—์„œ "new" ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
  • ์ฝ๊ธฐ ์ „์šฉ ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•ด ํด๋ž˜์Šค ์†์„ฑ์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด๋Ÿฌํ•œ ์†์„ฑ์˜ ์ •๋ณด๋Š” ํ•œ ๋ฒˆ๋งŒ ์“ธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ ํ›„์—๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Title', /* โ€ฆ */); $post->title = '๊ธฐํƒ€'; > ์˜ค๋ฅ˜: ์ฝ๊ธฐ ์ „์šฉ ์†์„ฑ Post::$title์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  "..." ๊ฐ’์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜์—ฌ ํด๋กœ์ €๋ฅผ ํ˜•์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: Closure::fromCallable('myFunc ๋Œ€์‹  myFunc(...)). ')): ํ•จ์ˆ˜ foo (int $a, int $b) { /* โ€ฆ */ } $foo = foo(โ€ฆ); $foo(a: 1, b: 2);
  • ๊ต์ฐจ ์œ ํ˜•์— ๋Œ€ํ•œ ์ „์ฒด ์ง€์›์ด ์ถ”๊ฐ€๋˜์–ด ๊ธฐ์กด ์œ ํ˜•์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์œ ํ˜•์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐœ ์ด์ƒ์˜ ์œ ํ˜• ์ปฌ๋ ‰์…˜์„ ์ •์˜ํ•˜๋Š” ํ†ตํ•ฉ ์œ ํ˜•๊ณผ ๋‹ฌ๋ฆฌ ๊ต์ฐจ ์œ ํ˜•์—์„œ๋Š” ๋‚˜์—ด๋œ ์œ ํ˜•์ด ์•„๋‹Œ ์„ธํŠธ์— ์ง€์ •๋œ ์œ ํ˜•์ด ๋ชจ๋‘ ์žˆ์–ด์•ผ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $ํฌ์ŠคํŠธ->getId(); }
  • ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฑฐ๋‚˜ ์ข…๋ฃŒ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ•จ์ˆ˜๊ฐ€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์ข…๋ฃŒํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ •์  ๋ถ„์„๊ธฐ์— ์•Œ๋ฆฌ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ์œ ํ˜• "never"๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. function dd(mixed $input): ์ ˆ๋Œ€ { ์ข…๋ฃŒ; }
  • ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ array_is_list๊ฐ€ ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐ์—ด์˜ ํ‚ค๊ฐ€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์ˆซ์ž ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. $list = [โ€œaโ€, โ€œbโ€, โ€œcโ€]; array_is_list($list); // ์ฐธ $notAList = [1 => "a", 2 => "b", 3 => "c"]; array_is_list($notAList); // false $ alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($ alsoNotAList); // ๊ฑฐ์ง“
  • ์ด์ œ "final" ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์œ„ ํด๋ž˜์Šค ์ƒ์ˆ˜๊ฐ€ ์žฌ์ •์˜๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. class Foo { final public const X = "foo"; } ํด๋ž˜์Šค Bar๋Š” Foo๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค { public const X = "bar"; > ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜: Bar::X๋Š” ์ตœ์ข… ์ƒ์ˆ˜ Foo::X๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. }
  • ๋””์Šคํฌ ์บ์‹œ์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ•์ œ๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด fsync ๋ฐ fdatasync ๊ธฐ๋Šฅ์ด ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. $file = fopen("sample.txt", "w"); fwrite($file, "์ผ๋ถ€ ๋‚ด์šฉ"); if (fsync($file)) { echo "ํŒŒ์ผ์ด ๋””์Šคํฌ์— ์„ฑ๊ณต์ ์œผ๋กœ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."; } fclose($file);
  • ์ด์ „์— ์‚ฌ์šฉ๋œ ์ ‘๋‘์‚ฌ "0" ์™ธ์— 0์ง„์ˆ˜์— ์ ‘๋‘์‚ฌ "0o" ๋ฐ "016O"๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 0 === 16o016; // ์ฐธ 0 === 16OXNUMX; // ์ง„์‹ค
  • $GLOBALS์˜ ์‚ฌ์šฉ์„ ์„ ํƒ์ ์œผ๋กœ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„๋ฐ˜ํ•˜๊ฒŒ ๋˜์ง€๋งŒ ์–ด๋ ˆ์ด ์ž‘์—… ์†๋„๋ฅผ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, $GLOBALS์— ๋Œ€ํ•œ ์“ฐ๊ธฐ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ํฌ์ธํ„ฐ๋กœ $GLOBALS๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ๊ณ ๋ ค๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 2000๊ฐœ ํŒจํ‚ค์ง€๋ฅผ ๋ถ„์„ํ•œ ๊ฒฐ๊ณผ ์ด โ€‹โ€‹๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ํŒจํ‚ค์ง€๋Š” 23๊ฐœ์— ๋ถˆ๊ณผํ•œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ œ์•ˆ์ด ์Šน์ธ๋˜๋ฉด 8.1์—์„œ๋Š” ๋” ์ด์ƒ $GLOBALS = [];์™€ ๊ฐ™์€ ํ‘œํ˜„์‹์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. $GLOBALS += []; $GLOBALS =& $x; $x =& $๊ธ€๋กœ๋ฒŒ; ์„ค์ •๋˜์ง€ ์•Š์Œ($GLOBALS); by_ref($GLOBALS);
  • ์ด์ œ ๋‚ด๋ถ€ ๋ฉ”์†Œ๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. PHP 8.1์—์„œ๋Š” ํ•จ์ˆ˜ ์„ ์–ธ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ์ƒ์„ฑ๋˜์ง€๋งŒ PHP 9.0์—์„œ๋Š” ๊ฒฝ๊ณ ๊ฐ€ ์˜ค๋ฅ˜๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.
  • ์ž์› ์‚ฌ์šฉ์—์„œ ๊ฐ์ฒด ์กฐ์ž‘์œผ๋กœ ๊ธฐ๋Šฅ์„ ์ด์ „ํ•˜๋Š” ์ž‘์—…์ด ๊ณ„์†๋˜์—ˆ์Šต๋‹ˆ๋‹ค. finfo_* ๋ฐ imap_* ๊ธฐ๋Šฅ์ด ๊ฐ์ฒด๋กœ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • null ํ—ˆ์šฉ์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋œ ๋‚ด๋ถ€ ํ•จ์ˆ˜์— null ๊ฐ’์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. PHP 8.1์—์„œ๋Š” str_contains("string", null)๊ณผ ๊ฐ™์€ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  PHP 9์—์„œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • MurmurHash3 ๋ฐ xxHash ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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