Money: Value Object
Wenn wir mehrere Variablen in einem Objekt zusammenzufassen, das einen fachlichen Wert repräsentiert, dann nennen wir das ein Wertobjekt (Value Object).
Reden wir über Geld, das ist ein gutes Beispiel für ein Wertobjekt.
Für ein Money-Wertobjekt brauchen einen Wert (die Menge Geld) und die Währung.
Für die Währung verwenden wir eine Enum
:
<?php declare(strict_types=1);
namespace spriebsch\tfd\designPatterns\valueObject\money;
class Money
{
public function __construct(
private int $amountInCents,
private Currency $currency
) {}
}
<?php declare(strict_types=1);
namespace spriebsch\tfd\designPatterns\valueObject\money;
enum Currency
{
case EUR;
case GBP;
}
Wir repräsentieren den Geldbetrag als Integer in Cent, um Rundungsfehler zu vermeiden. Damit es keine Verwirrung gibt, machen wir das im Namen deutlich.
Diese Lösung wirft allerdings schon jetzt ein spannendes Problem auf. Wir verwenden ein Objekt, um einen fachlichen Wert zu repräsentieren. Wenn wir skalare Werte als Parameter übergeben, werden diese von PHP kopiert. Das nennt man auch Call by Value.
Wenn wir dagegen Objekte als Parameter übergeben, übergibt PHP eine Referenz auf das Objekt, über die wir dieses Objekt manipulieren können, sprich Methoden darauf aufrufen. Das ist normalerweise so erwünscht.