final class Name { private $lastName; private $firstName; private $insertion; public function __construct(string $lastName, string $firstName, string $insertion) { $this->lastName = $lastName; $this->firstName = $firstName; $this->insertion = $insertion; $this->nameMustHaveLastName(); } private function nameMustHaveLastName(): void { if (!$this->lastName) { throw InvalidName::becauseLastNameIsMissing(); } } public function getLastName(): string { /**/ } public function getFirstName(): string { /**/ } public function getInsertion(): string { /**/ } }
final class EmailAddress { private $emailAddress; public function __construct(string $emailAddress) { $this->emailAddress = $emailAddress; $this->emailAddressMustBeAnActualEmailAddress(); } private function emailAddressMustBeAnActualEmailAddress(): void { if (!filter_var($this->emailAddress, FILTER_VALIDATE_EMAIL)) { throw InvalidEmailAddress::becauseThisIsNotAnEmailAddress(); } } public function asString(): string { return $this->emailAddress; } }
final class Attendee { private $id; private $name; private $emailAddress; public function __construct(Uuid $id, Name $name, EmailAddress $emailAddress) { $this->id = $id; $this->name = $name; $this->emailAddress = $emailAddress; } public function getId(): Uuid { /**/ } public function getName(): Name { /**/ } public function setName(Name $name): Attendee { /**/ } public function getEmailAddress(): EmailAddress { /**/ } public function setEmailAddress(EmailAddress $emailAddress): Attendee { $this->emailAddress = $emailAddress; return $this; } }
new Meeting( Uuid::generate(), 'Dutch PHP Conference 2018', '...', '#DPC18', new MeetingDuration( new DateTimeImmutable('2018-06-07' . ' ' . '09:00'), new DateTimeImmutable('2018-06-08' . ' ' . '18:00') ), false, 'EUROPE\'S MOST EXCITING WEB CONFERENCE!', new Program([ new Slot( new SlotDuration( new DateTimeImmutable('2018-06-08' . ' ' . '15:45'), new DateTimeImmutable('2018-06-08' . ' ' . '16:30') ), 'Technically DDD', 'E104' ), new Slot( new SlotDuration( new DateTimeImmutable('2018-06-09' . ' ' . '13:30'), new DateTimeImmutable('2018-06-09' . ' ' . '14:15') ), 'The Developer\’s Model for Talking to Managers', 'E102' ), ]) // ..