- str_contains: documentation ( source)
<?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