PHP 8 в восьми кусочках кода
https://stitcher.io/blog/php-8-in-8-code-blocksВ PHP 8 появилось много новых функций, в этом списке мы рассмотрим самые выдающиеся.
use \Support\Attributes\ListensTo; class ProductSubscriber { <<ListensTo(ProductCreated::class)>> public function onProductCreated(ProductCreated $event) { /* … */ } <<ListensTo(ProductDeleted::class)>> public function onProductDeleted(ProductDeleted $event) { /* … */ } }
Вместо docblock - атрибуты.
Да, я знаю, синтаксис может быть не таким, как вы хотели или надеялись. Возможно, вы предпочли бы @, @:, или docblocks, или ... Но он будет именно таким. Единственное, что стоит упомянуть о синтаксисе, это то, что все варианты были обсуждены, и есть очень веские причины, по которым этот синтаксис был выбран. Вы можете прочитать краткое резюме об этом в RFC, или вы можете прочитать всю дискуссию о RFC в списке внутренних компонентов.
public function foo(Foo|Bar $input): int|float; public function bar(mixed $input): mixed;
Объединение типов позволяет подсказывать типы нескольких типов. Также есть новый mixed тип, который представляет несколько типов одновременно.
interface Foo { public function bar(): static; }
Можно указать static
в return type.
[JIT] opcache.jit=5
Встроенный JIT-компилятор.
Что такое JIT?
«JIT» расшифровывается как "just in time" - «просто вовремя», или «как раз вовремя» . Вы, вероятно, знаете, что PHP является интерпретируемым языком: он не скомпилирован как программа на C, Java или Rust. Вместо этого он переводится в машинный код - то, что понимает процессор - во время выполнения.
«JIT» - это метод, который компилирует части кода во время выполнения, так что вместо этого можно использовать скомпилированную версию.
Думайте об этом как о «кэшированной версии» интерпретируемого кода, сгенерированного во время выполнения.
$triggerError = fn() => throw new MyError(); $foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');
throw
может быть использован в выражениях.
try { // Something goes wrong } catch (MySpecialException) { Log::error("Something went wrong"); }
Можно не указывать переменную исключения, если она вам не нужна.
public function( string $parameterA, int $parameterB, Foo $objectfoo, ) { // … }
В конце списка параметров можно указать запятую.
str_contains('string with lots of words', 'words'); str_starts_with('haystack', 'hay'); str_ends_with('haystack', 'stack');
Новые строковые функции.
Давайте не будем обманывать себя: 8 блоков кода недостаточно для суммирования всех замечательных новых вещей в PHP 8. Итак, давайте просто добавим еще несколько.
function bar(Stringable $stringable) { /* … */ }
Новый Stringable
interface.
$object::class
Вызов ::class
сразу из объекта.