readonly class Email {
public function __construct(public string $value) {
if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException("Invalid email: $value");
}
}
// Методы возвращают НОВЫЙ объект
public function withDomain(string $domain): self {
$local = explode('@', $this->value)[0];
return new self("$local@$domain");
}
}
$email = new Email('john@old.com');
$new = $email->withDomain('new.com');
// $email не изменился, $new - новый объектПравила иммутабельности: readonly свойства, методы-модификаторы возвращают new self(...), нет сеттеров.