Денис Васишак, Студия "Флаг"
public function foo(Foo|Bar $input): int|float;
void не может использваться как часть union types, т.к. void означает "не возвращает ничего". Более того, nullable unions могут быть написаны используя |null или ?
public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;
Именованные аргументы позволяют передавать значения в функцию указывая имя значения. Не обязательно соблюдать порядок объявления и также можно пропускать необязательные параметры
function foo(string $a, string $b, ?string $c = null, ?string $d = null)
foo(
b: 'value b',
a: 'value a',
d: 'value d',
);
class PostsController
{
#[Route("/api/posts/{id}", methods: ["GET"])]
public function get($id) { /* ... */ }
}
echo match (8.0) {
'8.0' => "О нет!",
8.0 => "То, что я и ожидал",
};
//> То, что я и ожидал
//PHP 7.4
$country = null;
if ($session !== null) {
$user = $session->user;
if ($user !== null) {
$address = $user->getAddress();
if ($address !== null) {
$country = $address->country;
}
}
}
//Laravel
$country = optional(optional(optional($session)->user)->getAddress())->country;
//PHP 8
$country = $session?->user?->getAddress()?->country;
class Point {
public float $x;
public float $y;
public float $z;
public function __construct(float $x, float $y, float $z) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}
class Point {
public function __construct(
public float $x,
public float $y,
public float $z,
) {}
}
//PHP 7.4
0 == 'foobar' // true
//PHP 8
0 == 'foobar' // false
При сравнении с числовой строкой PHP 8 использует сравнение чисел. В противном случае число преобразуется в строку и используется сравнение строк.
class Foo
{
public function test(): static
{
return new static();
}
}
$triggerError = fn () => throw new MyError();
$foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');
Слабые карты (weak maps) позволяют создавать связи между объектами и произвольными значениями (как и SplObjectStorage), при этом объекты, используемые в качестве ключей, не защищаются от сборщика мусора. Если сборщик уничтожает такой объект, тот просто удаляется из карты.
try {
// Something goes wrong
} catch (Exception) {
Log::error("Something went wrong");
}
public function(
string $a,
int $b,
Foo $foo,
) {
// …
}