在编写类方法

时间:2016-12-02 20:49:29

标签: php validation coding-style

如果您有多个输入,如何在此示例中继续编写代码:

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这对我/我们有帮助,但之后我们还要检查{{{ 1}}为空或$name不低于或高于xy。

这个变量确实是例如。我会对你们在这种情况下如何进步感兴趣。以各种方式验证所有内容,或只检查类型?

2 个答案:

答案 0 :(得分:0)

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

这里重要的一点是,它不仅要验证验证,还要考虑所有方法,制定方法只做一件事。这个规则应该包含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设置属性,除了设置器本身之外,您无需担心验证。

答案 1 :(得分:0)

(从评论转换为答案)老实说,为什么重新发明轮子。我使用的验证库如github.com/Respect/Validation - 只需通过Composer包含它。