Disclaimer: ссылка на эту статью на английском языке уже была в посте последнего PHP дайджеста. Если владеете языком достаточно, возможно, стоит перейти к оригиналу, там очень много сносок на другие англоязычные статьи.
Раз
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, который автоматически добавляется в классы, которые реализуют метод __toString ().
Десять
$object::class
Вызов ::class сразу из объекта.
dimsog
А скажите пожалуйста, как обстоят дела с обобщениями в PHP 8?