Читать книгу PHP 8. Новинки языка и программы для работы с ним - Михаил Сергеевич Губин - Страница 3
Новые возможности
ОглавлениеТипы объединения
Учитывая динамическую типизированную природу PHP, существует множество случаев, когда типы объединения могут быть полезны. Типы объединения – это набор из двух или более типов, которые указывают, что любой из них может быть использован.
public function foo (Foo|Bar $input): int|float;
Обратите внимание, что «void» никогда не может быть частью типа объединения, так как он указывает на отсутствие возвращаемого значения вообще. Кроме того, обнуляемые союзы могут быть записаны с помощью "|null» или с помощью существующего обозначения»?»:
public function foo (Foo|null $foo): void;
public function bar (?Bar $bar): void;
JIT
JIT – just in time-компилятор обещает значительное повышение производительности, хотя и не всегда в контексте веб-запросов. Мне кажется, что JIT не имеет большого значения, если вообще имеет значение для PHP-проектов.
Нулевой безопасный оператор
Если вы знакомы с оператором слияния null, вы уже знакомы с его недостатками: он не работает при вызовах методов. Вместо этого вам нужны промежуточные проверки или полагайтесь на необязательных помощников, предоставляемых некоторыми фреймворками:
$startDate = $booking-> getStartDate ();
$dateAsString = $startDate? $startDate-> asDateTimeString (): null;
С добавлением нулевого безопасного оператора мы теперь можем иметь нулевое коалесцирующее поведение на методах!
$dateAsString = $booking-> getStartDate ()? -> asDateTimeString ();
Именованные аргументы
Именованные аргументы позволяют передавать значения функции, указывая имя значения, так что вам не нужно принимать во внимание их порядок, а также вы можете пропустить необязательные параметры!
function foo (string $a, string $b,?string $c = null,?string $d = null) {/* … */}
foo (b: ’value b’, a: ’value a’, d: ’value d’,);
Атрибуты
Атрибуты, обычно известные как аннотации на других языках, предлагают способ добавления метаданных в классы без необходимости разбора docblocks.
Что касается быстрого взгляда, вот пример того, как выглядят атрибуты, из RFC:
use App\Attributes\ExampleAttribute;
@@ExampleAttribute class Foo
{
@@ExampleAttribute public const FOO = ’foo’;
@@ExampleAttribute public $x;
@@ExampleAttribute public function foo (
@@ExampleAttribute $bar) {}
}
@@Attribute class ExampleAttribute {
public $value; public function __construct ($value) {$this-> value = $value;
}
}
Обратите внимание, что этот базовый атрибут раньше назывался атрибутом PHP в исходном RFC, но впоследствии был изменен другим RFC. Если вы хотите глубоко погрузиться в то, как работают атрибуты, и как вы можете построить свой собственный.
Также обратите внимание, что синтаксис атрибута все еще может измениться, он все еще не определен.
Выражение соответствия
Вы можете назвать его старшим братом выражения switch: match может возвращать значения, не требует операторов break, может комбинировать условия, использует строгие сравнения типов и не выполняет никакого принуждения типов.