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