αααααΆααααΈαα½αααααΆαααααΆαα’αα·αααααα ααΆαα ααααααΆαααΆααΆααααααααααα·ααΈ PHP 8.1 ααααΌαααΆααααα αΆαα ααΆααΆααααΈααααα½ααααα αΌαααΆαααααααΈαααα»αααΆαααααΈ ααααΌα ααΆααΆαααααΆααααααΌαααΆα αααΎαααααααααααΆαααααααΆα
ααΆααααααα’ααααΆααααα αααα»α PHP 8.1α
- ααΆαααααααααΆαααΆαααααααααΆααααΆαααΆααααΆα§ααΆα ααα α₯α‘αΌααααα’αααα’αΆα ααααΎααΆαααααΆαααΆααΆααααααααΆαα enum ααααΆαααΆα { case Pending; ααααΈααααα; ααααΈαα»ααααα»ααααααααΆα; } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(ααααΆαααΆα $status): void { // β¦ } } $post->setStatus(Status::Active);
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π»Π΅Π³ΠΊΠΎΠ²Π΅ΡΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡΡ ΡΠ°ΠΉΠ±Π΅ΡΠ°ΠΌΠΈ (Fiber) ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΌΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π° Π½ΠΈΠ·ΠΊΠΎΠΌ ΡΡΠΎΠ²Π½Π΅. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΠ°ΠΉΠ±Π΅ΡΠΎΠ² ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π²ΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΈ Amphp ΠΈ ReactPHP. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend(βafter suspendingβ); // β¦ }); $valueAfterSuspending = $fiber->start(); $fiber->resume(βafter resumingβ);
- Π£Π»ΡΡΡΠ΅Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΡΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° (opcache), Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠ»Π°ΡΡΠΎΠ². ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° ΠΏΠΎΠ΄Π½ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° 5-8%. ΠΠ· Π΄ΡΡΠ³ΠΈΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΉ ΠΎΡΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠ°Π±ΠΎΡΡ JIT, ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ JIT Π΄Π»Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ARM64 (AArch64), ΡΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠΌΡΠ½, ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ 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($α’αΆαα); // ["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 = βOtherβ; > Error: Cannot modify readonly property Post::$title
- Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½ΠΎΠ²ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π΄Π»Ρ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² (callable) β Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ, Π²ΡΠ·Π²Π°Π² ΡΡΠ½ΠΊΡΠΈΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π² Π΅ΠΉ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Β«β¦Β» (Ρ.Π΅. myFunc(β¦) Π²ΠΌΠ΅ΡΡΠΎ Closure::fromCallable(βmyFuncβ)): function foo(int $a, int $b) { /* β¦ */ } $foo = foo(β¦); $foo(a: 1, b: 2);
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°ΡΡΠΈΡ ΡΡ ΡΠΈΠΏΠΎΠ² (intersection types), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΠΈΠΏΡ, ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅. Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ union-ΡΠΈΠΏΠΎΠ², ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΠΈΠ· Π΄Π²ΡΡ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠΈΠΏΠΎΠ², intersection-ΡΠΈΠΏΡ ΡΡΠ΅Π±ΡΡΡ Π½Π°Π»ΠΈΡΠΈΡ Π² Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠΌ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅ Π½Π΅ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΡΠΈΠΏΠΎΠ², Π° Π²ΡΠ΅Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΡΠΈΠΏΠΎΠ². function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
- ααΆαααααααααααΈ "αα·αααα" αααα’αΆα ααααΌαααΆαααααΎααΎααααΈααΌαααααΉααααα’ααααα·ααΆααα·αα·ααααααΆαα»αααΆααα½αααΉααααα ααααΆαααααα·ααααα·αααααα·ααΈα§ααΆα αααααααααα ααααααΈααΎααααα¬ααααα·ααααα·αα»αααΆαα αΆαα ααα αα»αααΆα dd (αααα αΌα $ α αααα»α): αα·αααα { α αα; }
- αα»αααΆαααααΈ array_is_list ααααΌαααΆαααααΎα‘αΎα αααα’αα»ααααΆαα±ααα’ααααααααααΆ ααααΆααα α»α αα αααα»αα’αΆααααααΌαααΆααααα αααΆαααααΆααααααΆαααΎαα‘αΎααααααααα αααα αΆααααααΎαααΈ 0: $list = [βaβ, βbβ, βcβ]; array_is_list($list); // true $notAList = [1 => βaβ, 2 => βbβ, 3 => βcβ]; array_is_list($notAList); // αα·ααα·α $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // αα·ααα·α
- ΠΠ»Ρ Π·Π°ΠΏΡΠ΅ΡΠ° ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ Β«finalΒ». class Foo { final public const X = Β«fooΒ»; } class Bar extends Foo { public const X = Β«barΒ»; > Fatal error: Bar::X cannot override final constant Foo::X }
- αα»αααΆα fsync αα·α fdatasync ααααΌαααΆαααααΎα‘αΎαααΎααααΈαααααααΆαααααΆααααααΌαααΎααααΈαααααΆαα»αααΈααααΆαααααααΆααααΆα $file = fopen("sample.txt", "w"); fwrite($file, "ααΆαα·ααΆαααα"); ααααα·αααΎ (fsync($file)) { ααααα "α―αααΆαααααΌαααΆαααααααααααααααα ααΆαα"; } fclose ($ α―αααΆα);
- ααΆαααααααααααααΆααααα»αααΆαααααΎαα»ααααα "0o" αα·α "0O" αααααΆααααααααααααΆαααΈ ααααααααΈααΎαα»ααααααααααΆαααααΎααΈαα»α "0"α α α‘α¦ === α oα‘α¦; // true 016 === 0O16; // αα·α
- ααΆααααΌαααΆαααααΎα‘αΎαααΎααααΈαααααααΆαααααΎαααααΆαααααΎααααΆαα $GLOBALS αααααΉαααΆαα±ααααΆαααΆααααααααΎααΆαααααααΆααααααα ααα»ααααααΉαααααΎα±ααααΆα’αΆα αααααΎαααααΏαααααα·ααααα·ααΆααααΆαααααΆααααΆαα½αααΉαα’αΆααα ααΆα§ααΆα ααα ααααααΆαααααΆααα·αααΆαααααααα ααΆαα $GLOBALS αα·αααΆαααααααΆαα $GLOBALS αααααααα·α αααα»αααααΌαααΆααα·α αΆαααΆα ααΆααα·ααΆααααααα ααα ααα½α 2000 ααΆααααα αΆαααΆααΆααα 23 ααα»ααααααααα»αα αααααα½αααααΉαααααΌαααΆααααααααααΆαααααααΆαααααΆααααααΌααααα α§ααΆα ααα ααααα·αααΎααααΎααααΌαααΆαα’αα»ααα 8.1 ααΉααα·αααΆααααααΆααααα ααααα·ααΌα ααΆα $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; αα·αααααα($GLOBALS); by_ref($GLOBALS);
- ΠΠ½ΡΡΡΠ΅Π½Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠ΅ΠΏΠ΅ΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠΈΠΏ. Π PHP 8.1 ΠΏΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΡΠΈΠΏΠ°, Π½Π΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ, Π±ΡΠ΄ΡΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Π½ΠΎ Π² PHP 9.0 ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΎ Π½Π° ΠΎΡΠΈΠ±ΠΊΡ.
- ααΆαααΆαααΆαααααααΎααΆαααααααα»αααΆαααΈααΆαααααΎααααΆααααααΆααα ααΆααααα αααααα»α αα»αααΆα finfo_* αα·α imap_* ααααΌαααΆαααααααα ααααα»α
- ααΆαααααααΆααααααα null ααΆα’αΆαα»ααααααα αα»αααΆαααΆααααα»ααααααααΌαααΆααααααΆααααΆαα·ααααααΆααααααααΌαααΆαααα·αααα αα αααα»α PHP 8.1 ααΆαααααΎ constructs ααΌα ααΆ str_contains("string", null) ααΉαααΆαα±ααααΆαααΆααααααΆα α αΎααα αααα»α PHP 9 ααΉαααΆαααα α»αα
- ααΆαααααααααΆαααΆαααααααααΆαα MurmurHash3 αα·α xxHash hashing algorithms α
ααααα: opennet.ru