Учитывая сколько сейчас пишут про новинки php версии 8, данная заметка будет очередной каплей в море, но хочу оставить ее "на память" :-)
Небольшая памятка: Новинки php 8
Выражение Match - RFC: Match expression v2
Замена
switch ($this->lexer->lookahead['type']) { case Lexer::T_SELECT: $statement = $this->SelectStatement(); break; case Lexer::T_UPDATE: $statement = $this->UpdateStatement(); break; case Lexer::T_DELETE: $statement = $this->DeleteStatement(); break; default: $this->syntaxError('SELECT, UPDATE or DELETE'); break; }
на
$statement = match ($this->lexer->lookahead['type']) { Lexer::T_SELECT => $this->SelectStatement(), Lexer::T_UPDATE => $this->UpdateStatement(), Lexer::T_DELETE => $this->DeleteStatement(), default => $this->syntaxError('SELECT, UPDATE or DELETE'), };
Adding Meta Data Using Attributes - надо разобраться
Promoted Properties - constructor promotion
Замена
class Point { public float $x; public float $y; public float $z; public function __construct($x = 0.0, $y = 0.0, $z = 0.0) { $this->x = $x; $this->y = $y; $this->z = $z; } }
на
class Point { public function __construct( public float $x = 0.0, public float $y = 0.0, public float $z = 0.0, ) { // ... } }
Named arguments:
class MyCalss { function __construct(string $a, string $b, int $c) { // ... } } $aValues = [ 'a' => 'A', 'b' => 'B', 'c' => 11, ]; $oTMP = new MyCalss(... $aValues);
Union types - Union Types 2.0
class MyCalss { } function myFunction(string|array|MyCalss|null $mixed) { // $mixed } myFunction(new MeClass());
Новое для php 8: MyCalss и null
nullsafe operator - Nullsafe operator
$aRes = Post::getById(10)->dt_created->format('d.m.Y');
- а что если getById не вернет запись?
Безопасный вариант:
$aRes = Post::getById(10)?->dt_created?->format('d.m.Y');
Если любая часть вернет null, то дальше цепочка не будет вызываться и вернет в переменную $aRes - null
Еще более полезный вариант, с проверкой на null:
$aRes = Post::getById(10)?->dt_created?->format('d.m.Y') ?? 'Error getById, or...';
Improved Exceptions - throw expression и non-capturing catches
Было
try{ throw new Exception(); } catch (Exception $exception) { echo 'Exception catched<br />'; }
Стало возможно:
try{ $trigger = fn() => throw new Exception(); $trigger(); } catch (Exception) { echo 'Exception catched<br />'; }
Object classnames:
Было:
class MyClass { } echo MyClass::class;
Стало возможным:
class MyClass { } $oTmp = MyClass; echo $oTmp::class;
The Stringable interface - Add Stringable interface
class MyClass { public function __toString() : string { return 'String'; } } function myFunction(string|Stringable $mixed){ return (string) $mixed; } echo myFunction(new MyClass());
По сути добавление метода __toString, добавлет классу интерфейс Stringable
Добавлены 3и новых функции для работы со строками: str_contains, str_starts_with и str_ends_with
str_contains и Add str_starts_with() and str_ends_with() functionsКласс WeakMap - WeakMap
Не совсем уверен является ли он частью ядра phph 8, т.к. указано (PECL weakref >= 0.2.0)
Если кратко - то можно использовать объекты как люючи "массива" (тут не Array а именно WeakMap)
$wm = new WeakMap(); $oTMP = new StdClass; $wm[$oTMP ] = '123';
Добавленеи последней запятой в перечень аргументов функции / метода:
function myFunction( $a, $b, $c, ){ // ... }
$c,