在PHP中有精制类型的库吗?

时间:2017-03-09 09:57:46

标签: php types refinement-type

在php中是否有任何精简类型的库可以让我做这样的事情?

function getAge(int positive $age){
...
}

getAge(-1) // error -1 < 0

谢谢!

1 个答案:

答案 0 :(得分:1)

您需要在引擎级别实施细化类型。还没有人这样做过。

或者使用userland预处理器,例如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++