ืฉื—ืจื•ืจ ืฉืคืช ื”ืชื›ื ื•ืช PHP 8.1

ืœืื—ืจ ืฉื ื” ืฉืœ ืคื™ืชื•ื—, ื”ื•ืฆื’ื” ืฉื—ืจื•ืจ ืฉืคืช ื”ืชื›ื ื•ืช PHP 8.1. ื”ืกื ื™ืฃ ื”ื—ื“ืฉ ื›ื•ืœืœ ืฉื•ืจื” ืฉืœ ืคื™ืฆ'ืจื™ื ื—ื“ืฉื™ื, ื›ืžื• ื’ื ืžืกืคืจ ืฉื™ื ื•ื™ื™ื ื”ืฉื•ื‘ืจื™ื ืืช ื”ืชืื™ืžื•ืช.

ืฉื™ืคื•ืจื™ื ืžืจื›ื–ื™ื™ื ื‘-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);
  • ื ื•ืกืคื” ืชืžื™ื›ื” ื‘ื—ื•ื˜ื™ื ืงืœื™ื ื”ื ืงืจืื™ื Fibres, ื”ืžืืคืฉืจื™ื ืœื ื”ืœ ื—ื•ื˜ื™ ื‘ื™ืฆื•ืข ื‘ืจืžื” ื ืžื•ื›ื”. ืชืžื™ื›ื” ื‘ืกื™ื‘ื™ื ืžืชื•ื›ื ื ืช ืœื”ืชื•ื•ืกืฃ ืœืžืกื’ืจื•ืช 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, ื‘ื™ืฆื•ืขื™ื ืžื•ื’ื‘ืจื™ื ืฉืœ ืกื“ืจื” ื•-deserialization, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ get_declared_classes(), explode() , ืคื•ื ืงืฆื™ื” strtr(), strnatcmp(), dechex(). ื‘ืื•ืคืŸ ื›ืœืœื™, ื™ืฉ ืขืœื™ื™ื” ืฉืœ 23.0% ื‘ื‘ื™ืฆื•ืขื™ื ืขื‘ื•ืจ Symfony Demo, ื•-3.5% ืขื‘ื•ืจ ื•ื•ืจื“ืคืจืก.
  • ืื•ืคืจื˜ื•ืจ ื”ืคืจื™ืงื” ื‘ืชื•ืš ืžืขืจื›ื™ื "...$var", ื”ืžืืคืฉืจ ื”ื—ืœืคื” ืฉืœ ืžืขืจื›ื™ื ืงื™ื™ืžื™ื ื‘ืขืช ื”ื’ื“ืจืช ืžืขืจืš ื—ื“ืฉ, ื”ื•ืจื—ื‘ ืœืชืžื™ื›ื” ื‘ืžืคืชื—ื•ืช ืžื—ืจื•ื–ื•ืช (ื‘ืขื‘ืจ ื ืชืžื›ื• ืจืง ืžื–ื”ื™ื ื“ื™ื’ื™ื˜ืœื™ื™ื). ืœื“ื•ื’ืžื”, ื›ืขืช ืชื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘ืงื•ื“: $array1 = ["a" => 1]; $array2 = ["b" => 2]; $array = ["a" => 0, โ€ฆ$array1, โ€ฆ$array2]; var_dump($array); // ["a" => 1, "b" => 2]
  • ืžื•ืชืจ ืœื”ืฉืชืžืฉ ื‘ืžื™ืœืช ื”ืžืคืชื— "ื—ื“ืฉื”" ื‘ืืชื—ื•ืœื™ื, ื›ื’ื•ืŸ ื‘ื”ื’ื“ืจื•ืช ืคื•ื ืงืฆื™ื•ืช ื›ืคืจืžื˜ืจ ื‘ืจื™ืจืช ืžื—ื“ืœ ืื• ื‘ืชื›ื•ื ื•ืช ืืจื’ื•ืžื ื˜. class MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
  • ืืคืฉืจ ืœืกืžืŸ ืžืืคื™ื™ื ื™ ืžื—ืœืงื” ืœื’ื™ืฉื” ืœืงืจื™ืื” ื‘ืœื‘ื“ (ื ื™ืชืŸ ืœื›ืชื•ื‘ ืžื™ื“ืข ื‘ืžืืคื™ื™ื ื™ื ื›ืืœื” ืจืง ืคืขื ืื—ืช, ื•ืœืื—ืจ ืžื›ืŸ ื”ื•ื ืœื ื™ื”ื™ื” ื–ืžื™ืŸ ืœืฉื™ื ื•ื™). class PostData { public function __construct( ืžื—ืจื•ื–ืช ืงืจื™ืื” ืฆื™ื‘ื•ืจื™ืช $title, ืฆื™ื‘ื•ืจื™ืช ืœืงืจื™ืื” ื‘ืœื‘ื“ DateTimeImmutable $date, ) {} } $post = new Post('Title', /* โ€ฆ */); $post->title = 'ืื—ืจ'; > ืฉื’ื™ืื”: ืœื ื ื™ืชืŸ ืœืฉื ื•ืช ืืช ื”ืžืืคื™ื™ืŸ ืœืงืจื™ืื” ื‘ืœื‘ื“ Post::$title
  • ืชื—ื‘ื™ืจ ื—ื“ืฉ ื™ื•ืฉื ืขื‘ื•ืจ ืื•ื‘ื™ื™ืงื˜ื™ื ื”ื ื™ืชื ื™ื ืœื”ืชืงืฉืจื•ืช - ื›ืขืช ื ื™ืชืŸ ืœื™ืฆื•ืจ ืกื’ื™ืจื” ืขืœ ื™ื“ื™ ืงืจื™ืื” ืœืคื•ื ืงืฆื™ื” ื•ื”ืขื‘ืจืช ื”ืขืจืš "..." ื›ืืจื’ื•ืžื ื˜ (ื›ืœื•ืžืจ myFunc(...) ื‘ืžืงื•ื Closure::fromCallable('myFunc ')): function foo (int $a, int $b) { /* โ€ฆ */ } $foo = foo(โ€ฆ); $foo(a: 1, b: 2);
  • ื ื•ืกืคื” ืชืžื™ื›ื” ืžืœืื” ื‘ืกื•ื’ื™ ืฆื•ืžืชื™ื, ื”ืžืืคืฉืจืช ืœืš ืœื™ืฆื•ืจ ืกื•ื’ื™ื ื—ื“ืฉื™ื ืขืœ ื™ื“ื™ ืฉื™ืœื•ื‘ ืฉืœ ืกื•ื’ื™ื ืงื™ื™ืžื™ื. ื‘ื ื™ื’ื•ื“ ืœืกื•ื’ื™ ืื™ื—ื•ื“, ื”ืžื’ื“ื™ืจื™ื ืื•ืกืคื™ื ืฉืœ ืฉื ื™ ืกื•ื’ื™ื ืื• ื™ื•ืชืจ, ืกื•ื’ื™ ืฆืžืชื™ื ื“ื•ืจืฉื™ื ื ื•ื›ื—ื•ืช ืฉืœ ืœื ืืฃ ืื—ื“ ืžื”ืกื•ื’ื™ื ื”ืžืคื•ืจื˜ื™ื, ืืœื ื›ืœ ื”ืกื•ื’ื™ื ืฉืฆื•ื™ื ื• ื‘ืขืจื›ื” ืœืžื™ืœื•ื™. function generSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • ื™ืฉ ืกื•ื’ ื—ื“ืฉ ืฉืœ "ืœืขื•ืœื ืœื" ืฉื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื• ื›ื“ื™ ืœื™ื™ื“ืข ืžื ืชื—ื™ื ืกื˜ื˜ื™ื™ื ืฉืคื•ื ืงืฆื™ื” ืชืกื™ื™ื ืืช ื‘ื™ืฆื•ืข ื”ืชื•ื›ื ื™ืช, ืœืžืฉืœ ืขืœ ื™ื“ื™ ื–ืจื™ืงืช ื—ืจื™ื’ื” ืื• ื‘ื™ืฆื•ืข ืคื•ื ืงืฆื™ื™ืช ื”ื™ืฆื™ืื”. function dd(ืžืขื•ืจื‘ $input): never { exit; }
  • ื”ื•ืฆืขื” ืคื•ื ืงืฆื™ื” ื—ื“ืฉื” array_is_list, ื”ืžืืคืฉืจืช ืœืงื‘ื•ืข ืฉื”ืžืคืชื—ื•ืช ื‘ืžืขืจืš ืžืกื•ื“ืจื™ื ืœืคื™ ืกื“ืจ ืขืจื›ื™ื ืžืกืคืจื™ื™ื ื”ื•ืœื›ื™ื ื•ื’ื“ืœื™ื, ื”ื—ืœ ืž-0: $list = ["a", "b", "c"]; array_is_list($list); // true $notAList = [1 => "a", 2 => "b", 3 => "c"]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // ืฉืงืจ
  • ื›ืขืช ืชื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘ืžื™ืœืช ื”ืžืคืชื— "ืกื•ืคื™ืช" ื›ื“ื™ ืœืžื ื•ืข ืขืงื™ืคื” ืฉืœ ืงื‘ื•ืขื™ ืžื—ืœืงื•ืช ืื‘. class Foo { final public const X = "foo"; } class 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);
  • ื”ื•ืกืคื” ืืช ื”ื™ื›ื•ืœืช ืœื”ืฉืชืžืฉ ื‘ืงื™ื“ื•ืžืช "0o" ื•- "0O" ืขื‘ื•ืจ ืžืกืคืจื™ื ืื•ืงื˜ืœื™ื™ื, ื‘ื ื•ืกืฃ ืœืงื™ื“ื•ืžืช ืฉื”ืฉืชืžืฉื” ื‘ืขื‘ืจ "0". 016 === 0o16; // true 016 === 0O16; // ื ื›ื•ืŸ
  • ืžื•ืฆืข ืœื”ื’ื‘ื™ืœ ื‘ืื•ืคืŸ ืกืœืงื˜ื™ื‘ื™ ืืช ื”ืฉื™ืžื•ืฉ ื‘-$GLOBALS, ืžื” ืฉื™ื•ื‘ื™ืœ ืœื”ืคืจื” ืฉืœ ืชืื™ืžื•ืช ืœืื—ื•ืจ, ืืš ื™ืืคืฉืจ ืœื”ืื™ืฅ ืžืฉืžืขื•ืชื™ืช ืืช ื”ืคืขื•ืœื•ืช ืขื ืžืขืจื›ื™ื. ืœื“ื•ื’ืžื”, ื ื‘ื—ื ืช ื”ืืคืฉืจื•ืช ืฉืœ ื”ืฉื‘ืชืช ื›ืชื™ื‘ื” ืœ-$GLOBALS ื•ื”ืขื‘ืจืช $GLOBALS ื‘ืืžืฆืขื•ืช ืžืฆื‘ื™ืข. ื ื™ืชื•ื— ืฉืœ 2000 ื—ื‘ื™ืœื•ืช ื”ืจืื” ืฉืจืง 23 ืžื”ืŸ ื™ื•ืฉืคืขื• ืžื”ืฉื™ื ื•ื™ ื”ื–ื”. ืœื“ื•ื’ืžื”, ืื ื”ื”ืฆืขื” ืชืื•ืฉืจ, 8.1 ืœื ื™ืชืžื•ืš ืขื•ื“ ื‘ื‘ื™ื˜ื•ื™ื™ื ื›ื’ื•ืŸ: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS);
  • ืฉื™ื˜ื•ืช ืคื ื™ืžื™ื•ืช ืืžื•ืจื•ืช ื›ืขืช ืœื”ื—ื–ื™ืจ ืืช ื”ืกื•ื’ ื”ื ื›ื•ืŸ. ื‘-PHP 8.1, ื”ื—ื–ืจืช ืกื•ื’ ืฉืื™ื ื• ืชื•ืื ืœื”ืฆื”ืจืช ื”ืคื•ื ืงืฆื™ื” ืชืคื™ืง ืื–ื”ืจื”, ืืš ื‘-PHP 9.0 ื”ืื–ื”ืจื” ืชื•ื—ืœืฃ ื‘ืฉื’ื™ืื”.
  • ื”ืขื‘ื•ื“ื” ื ืžืฉื›ื” ืขืœ ื”ืขื‘ืจืช ืคื•ื ืงืฆื™ื•ืช ืžืฉื™ืžื•ืฉ ื‘ืžืฉืื‘ื™ื ืœืžื ื™ืคื•ืœืฆื™ื” ืฉืœ ืื•ื‘ื™ื™ืงื˜ื™ื. ื”ืคื•ื ืงืฆื™ื•ืช finfo_* ื•-imap_* ื”ื•ืขื‘ืจื• ืœืื•ื‘ื™ื™ืงื˜ื™ื.
  • ื”ืขื‘ืจืช ืขืจื›ื™ null ื›ืืจื’ื•ืžื ื˜ื™ื ืœืคื•ื ืงืฆื™ื•ืช ืคื ื™ืžื™ื•ืช ื”ืžืกื•ืžื ื•ืช ื›-nullable ื”ื•ืฆืื” ืžืฉื™ืžื•ืฉ. ื‘-PHP 8.1, ืฉื™ืžื•ืฉ ื‘ืžื‘ื ื™ื ื›ืžื• str_contains("string", null) ื™ื•ื‘ื™ืœ ืœืื–ื”ืจื”, ื•ื‘-PHP 9 ืœืฉื’ื™ืื”.
  • ื ื•ืกืคื” ืชืžื™ื›ื” ื‘ืืœื’ื•ืจื™ืชืžื™ ื”ื’ื™ื‘ื•ื‘ MurmurHash3 ื•-xxHash.

ืžืงื•ืจ: OpenNet.ru

ื”ื•ืกืคืช ืชื’ื•ื‘ื”