写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 $name
和 int $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.
将其包含在内
当您有多个输入时,您将如何继续编写代码,如本例所示:
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
这实际上有助于 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.
将其包含在内