如果您有多个输入,如何在此示例中继续编写代码:
public function addNameAndAge($name, $age) {
if (false === is_string($name) {
throw new InvalidArgumentException(...);
}
// ... same for age but using is_int().
}
我们是否必须检查这些输入?
我可以重写源代码以使用PHP 7的类型提示string $name
和int $age
这对我/我们有帮助,但之后我们还要检查{{{ 1}}为空或$name
不低于或高于xy。
这个变量确实是例如。我会对你们在这种情况下如何进步感兴趣。以各种方式验证所有内容,或只检查类型?
答案 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包含它。