Есть ли в php библиотека для уточненных типов, которая позволяет мне делать что-то подобное?
function getAge(int positive $age){
...
}
getAge(-1) // error -1 < 0
Спасибо!
Вам нужно будет реализовать уточнения типов на уровне двигателя. Никто еще не сделал этого.
Или используйте пользовательский препроцессор, например http://github.com/marcioAlmada/yay.
Или реализовать уточненные типы как объекты-значения, например,
class PositiveInteger
{
private $value;
public static function assertValid(int $value) {
if ($value < 0) {
throw new InvalidArgumentException("Not positive");
}
}
public function __construct(int $value)
{
static::assertValid($value);
$this->value = $value;
}
public function getValue(): int
{
return $this->value;
}
public function __toString(): string
{
return (string) $this->value;
}
}
Однако это означает, что int больше не является скаляром и не может использоваться так же, как вы бы использовали скаляр, например все операции должны быть методами. Вы не сможете сделать $age++
больше.
Других решений пока нет …