ืืืืจ ืฉื ื ืฉื ืคืืชืื, ืืืฆืื ืฉืืจืืจ ืฉืคืช ืืชืื ืืช 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