Es sind nur noch wenige Monate, bis PHP 8 veröffentlicht wird, und diese Version enthält wirklich viele gute Dinge. Unter dem Schnitt werden wir Ihnen erzählen, wie diese Innovationen bereits begonnen haben, den Ansatz des Autors beim Schreiben von Code zu ändern.
Ereignisabonnenten mit Attributen
Ich werde versuchen, Attribute nicht zu überbeanspruchen, aber im Fall des Einrichtens von Ereignis-Listenern sind sie beispielsweise sehr nützlich.
Vor kurzem habe ich an Systemen gearbeitet, in denen es viele solcher Einstellungen gab. Nehmen wir ein Beispiel:
class CartsProjector implements Projector
{
use ProjectsEvents;
protected array $handlesEvents = [
CartStartedEvent::class => 'onCartStarted',
CartItemAddedEvent::class => 'onCartItemAdded',
CartItemRemovedEvent::class => 'onCartItemRemoved',
CartExpiredEvent::class => 'onCartExpired',
CartCheckedOutEvent::class => 'onCartCheckedOut',
CouponAddedToCartItemEvent::class => 'onCouponAddedToCartItem',
];
public function onCartStarted(CartStartedEvent $event): void
{ /* … */ }
public function onCartItemAdded(CartItemAddedEvent $event): void
{ /* … */ }
public function onCartItemRemoved(CartItemRemovedEvent $event): void
{ /* … */ }
public function onCartCheckedOut(CartCheckedOutEvent $event): void
{ /* … */ }
public function onCartExpired(CartExpiredEvent $event): void
{ /* … */ }
public function onCouponAddedToCartItem(CouponAddedToCartItemEvent $event): void
{ /* … */ }
}
PHP 7
Attribute in PHP 8 haben zwei Vorteile:
- Der Code zum Einrichten von Ereignis-Listenern und -Handlern befindet sich an einer Stelle, und ich muss nicht zum Anfang scrollen, um zu sehen, ob der Listener korrekt eingerichtet ist.
- Ich muss mich nicht mehr um das Schreiben und Bearbeiten von Methodennamen als Zeichenfolgen kümmern (wenn die IDE diese nicht automatisch vervollständigen kann, gibt es keine statische Analyse von Tippfehlern und das Umbenennen von Methoden funktioniert nicht).
class CartsProjector implements Projector
{
use ProjectsEvents;
@@SubscribesTo(CartStartedEvent::class)
public function onCartStarted(CartStartedEvent $event): void
{ /* … */ }
@@SubscribesTo(CartItemAddedEvent::class)
public function onCartItemAdded(CartItemAddedEvent $event): void
{ /* … */ }
@@SubscribesTo(CartItemRemovedEvent::class)
public function onCartItemRemoved(CartItemRemovedEvent $event): void
{ /* … */ }
@@SubscribesTo(CartCheckedOutEvent::class)
public function onCartCheckedOut(CartCheckedOutEvent $event): void
{ /* … */ }
@@SubscribesTo(CartExpiredEvent::class)
public function onCartExpired(CartExpiredEvent $event): void
{ /* … */ }
@@SubscribesTo(CouponAddedToCartItemEvent::class)
public function onCouponAddedToCartItem(CouponAddedToCartItemEvent $event): void
{ /* … */ }
}
PHP 8
Statisch statt Dokumentblöcke
Dies ist keine große Veränderung, aber ich sehe es jeden Tag. Ich stelle häufig fest, dass ich immer noch Dokumentblöcke benötige, wenn ich angeben muss, dass eine Funktion einen statischen Rückgabetyp hat.
Wenn ich in PHP 7.4 schreiben musste:
/**
* @return static
*/
public static function new()
{
return new static();
}
PHP 7.4
Dann reicht es jetzt:
public static function new(): static
{
return new static();
}
PHP 8
DTO, Übergabe von Eigenschaften und benannten Argumenten
Ich habe ziemlich viel über die Verwendung des PHP-Typsystems und des DTO-Musters ( Data Transfer Objects ) geschrieben. Natürlich verwende ich DTOs häufig in meinem eigenen Code, sodass Sie sich vorstellen können, wie glücklich ich bin, dies jetzt umschreiben zu können:
class CustomerData extends DataTransferObject
{
public string $name;
public string $email;
public int $age;
public static function fromRequest(
CustomerRequest $request
): self {
return new self([
'name' => $request->get('name'),
'email' => $request->get('email'),
'age' => $request->get('age'),
]);
}
}
$data = CustomerData::fromRequest($customerRequest);
PHP 7.4
Hier ist das besser:
class CustomerData
{
public function __construct(
public string $name,
public string $email,
public int $age,
) {}
}
$data = new CustomerData(...$customerRequest->validated());
PHP 8
Beachten Sie die Verwendung der Übergabe von Konstruktoreigenschaften als benannte Parameter. Ja, sie können mit benannten Arrays und dem Spread-Operator übergeben werden.
Aufzählungen und Übereinstimmungen
Verwenden Sie eine Aufzählung mit einigen Methoden, die abhängig vom spezifischen Wert der Aufzählung ein Ergebnis zurückgeben?
/**
* @method static self PENDING()
* @method static self PAID()
*/
class InvoiceState extends Enum
{
private const PENDING = 'pending';
private const PAID = 'paid';
public function getColour(): string
{
return [
self::PENDING => 'orange',
self::PAID => 'green',
][$this->value] ?? 'gray';
}
}
PHP 7.4
Ich würde sagen, dass Sie für komplexere Bedingungen das Zustandsmuster besser verwenden sollten, aber es gibt Fälle, in denen eine Aufzählung ausreichend ist. Diese seltsame Array-Syntax ist bereits eine Abkürzung für einen umständlicheren bedingten Ausdruck:
/**
* @method static self PENDING()
* @method static self PAID()
*/
class InvoiceState extends Enum
{
private const PENDING = 'pending';
private const PAID = 'paid';
public function getColour(): string
{
if ($this->value === self::PENDING) {
return 'orange';
}
if ($this->value === self::PAID) {
return 'green'
}
return 'gray';
}
}
PHP 7.4 - Alternative
In PHP 8 können wir stattdessen Match verwenden.
/**
* @method static self PENDING()
* @method static self PAID()
*/
class InvoiceState extends Enum
{
private const PENDING = 'pending';
private const PAID = 'paid';
public function getColour(): string
{
return match ($this->value) {
self::PENDING => 'orange',
self::PAID => 'green',
default => 'gray',
};
}
PHP 8
Joins anstelle von Dokumentblöcken
Dies funktioniert ähnlich wie zuvor für den statischen Rückgabetyp beschrieben.
/**
* @param string|int $input
*
* @return string
*/
public function sanitize($input): string;
PHP 7.4
public function sanitize(string|int $input): string;
PHP 8
Ausnahmen werfen
Bisher konnten Sie einen Ausdruck nicht verwenden, was bedeutete, dass Sie beispielsweise die folgenden Überprüfungen schreiben mussten:
public function (array $input): void
{
if (! isset($input['bar'])) {
throw BarIsMissing::new();
}
$bar = $input['bar'];
// …
}
PHP 7.4
In PHP 8 wurde throw zu einem Ausdruck, was bedeutet, dass Sie ihn folgendermaßen verwenden können:
public function (array $input): void
{
$bar = $input['bar'] ?? throw BarIsMissing::new();
// …
}
PHP 8
Nullsicherer Operator
Wenn Sie mit dem Null-Koaleszenz-Operator vertraut sind, sind Sie sich seiner Nachteile bewusst: Er funktioniert nicht mit Methodenaufrufen. Daher brauchte ich oft Zwischenprüfungen oder Rahmenfunktionen, die für diesen Zweck geeignet waren:
$startDate = $booking->getStartDate();
$dateAsString = $startDate ? $startDate->asDateTimeString() : null;
PHP 7.4
Mit der Einführung des nullsafe-Operators kann ich dieses Problem viel einfacher lösen.
$dateAsString = $booking->getStartDate()?->asDateTimeString();
PHP 8
Welche Innovationen in PHP 8 halten Sie für wichtig?
Werbung
Server zum Entwickeln und Hosten Ihrer Projekte. Jeder Server ist mit einem 500-Megabit-Kanal verbunden, der vor DDoS-Angriffen geschützt ist. Es ist möglich, ein lokales Hochgeschwindigkeitsnetzwerk zu verwenden. Wir bieten eine breite Palette von Tarifplänen, Tarifänderungen mit einem Klick. Sehr praktisches Server Control Panel und die Möglichkeit, die API zu verwenden. Beeilen Sie sich, um zu überprüfen!
