写class方法时什么时候检查输入类型

When do you check input type when writing class method

当您有多个输入时,您将如何继续编写代码,如本例所示:

public function addNameAndAge($name, $age) {
    if (false === is_string($name) {
        throw new InvalidArgumentException(...);
    }

    // ... same for age but using is_int().
}

我们是否必须检查每个输入?

我可以重写源代码以使用 PHP 7 的类型提示 string $nameint $age 这实际上有助于 me/us,但之后我们还必须检查如果 $name 为空或 $age 不低于或高于 xy。

这个变量真的是举个例子。我很想知道你们在这种情况下会如何进步。以各种方式验证所有内容,还是只检查类型?

如果你想验证参数,其实使用一些验证库很方便。您可以将其作为依赖项注入。

这里的重点,它不仅考虑验证而且考虑所有方法,使方法只做一件事。这是方法应包含 5+/-2 行代码的规则。

class Person
{
    private $name;
    private $age;

    private $validator;

    public function __construct($validator)
    {
        $this->validator = $validator;
    }

    public function addNameAndAge($name, $age)
    {
        $this->setName($name)->setAge($age);

        return $this;
    }

    public function setName($name)
    {
        // perform validation here

        $this->name = $name;

        return $this;
    }

    public function setAge($age)
    {
        // perform validation here

        $this->age = $age;

        return $this;
    }
}

因此,如果我们将设置和验证操作定义为原子操作,这将起作用。但如果没有,我们可以更进一步,将验证提取到他们自己的方法中。

class Person
{
    private $name;
    private $age;

    private $validator;

    public function __construct($validator)
    {
        $this->validator = $validator;
    }

    public function addNameAndAge($name, $age)
    {
        $this->setName($name)->setAge($age);

        return $this;
    }

    public function setName($name)
    {
        $this->name = $name;

        $this->validateName();

        return $this;
    }

    private function validateName()
    {
        // perform validation here
    }

    public function setAge($age)
    {
        $this->age = $age;

        $this->validateAge();

        return $this;
    }

    private function validateAge()
    {
        // perform validation here
    }
}

如果您始终小心地使用 setter 设置属性,则无需担心验证,除了 setter 本身。

(从评论转为回答)老实说,为什么要重新发明轮子。我会使用诸如 github.com/Respect/Validation 之类的验证库——并通过 Composer.

将其包含在内