<?php
class ValueObject implements JsonSerializable {
protected $value;
public function jsonSerialize() {
return $this->value;
}
}
class Email extends ValueObject {
public function __construct(string $value) {
$email = filter_var($value, FILTER_VALIDATE_EMAIL);
if (false === $email) {
throw new Exception('Email is invalid.');
}
$this->value = $email;
}
}
class Age extends ValueObject {
public function __construct(int $value) {
if ($value > 150) {
throw new Exception('Age must be less than 150.');
}
$this->value = $value;
}
}
class User implements JsonSerializable {
private $email;
private $age;
public function __construct(Email $email) {
$this->email = $email;
}
public function setAge(Age $age) { $this->age = $age; }
public function jsonSerialize() {
return ['email' => $this->email, 'age' => $this->age];
}
}
$email = new Email('opexus@gmail.com');
$age = new Age(23);
$user = new User($email);
$user->setAge($age);
echo json_encode($user);
Deprecated: Return type of ValueObject::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/CX7fI on line 4
Deprecated: Return type of User::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /in/CX7fI on line 32
{"email":"opexus@gmail.com","age":23}
Catchable fatal error: Argument 1 passed to Email::__construct() must be an instance of string, string given, called in /in/CX7fI on line 38 and defined in /in/CX7fI on line 9
Process exited with code 255.