3v4l.org

run code in 500+ PHP versions simultaneously
<?php abstract class StringWrapper { protected function __construct(readonly public string $value) {} abstract public static function parse(string $raw): self; } class Email extends StringWrapper { public static function parse(string $raw): self { str_contains($raw, '@') or throw new InvalidArgumentException(); return new self($raw); } } class User { public function __construct(readonly public Email $email) {} // Constructors should be strict, use factory methods for a friendly API public static function make(string|Email $email): self { $email instanceof Email or $email = Email::parse($email); return new self($email); } } $user = new User(Email::parse("dude@la.us")); $user = User::make("walter@la.us"); // $user = User::make("donnie"); // throws
Output for 8.1.34, 8.2.0 - 8.2.31, 8.3.0 - 8.3.31, 8.4.1 - 8.4.22, 8.5.0 - 8.5.7

preferences:
53.84 ms | 857 KiB | 4 Q