Php 应在何处进行参数验证以避免代码重复
我想知道这里有哪些最佳实践/建议。假设我有一个类提供了操作XMLElement的函数Php 应在何处进行参数验证以避免代码重复,php,validation,oop,Php,Validation,Oop,我想知道这里有哪些最佳实践/建议。假设我有一个类提供了操作XMLElement的函数 class Foo { private $data; public function setData(\SimpleXMLElement $data): void { $this->data = $data; } public function getElement():string { return $this->
class Foo
{
private $data;
public function setData(\SimpleXMLElement $data): void
{
$this->data = $data;
}
public function getElement():string
{
return $this->data->element;
}
}
该类在另一个类中使用,如下所示:
class Bar
{
public function fooBar(string $data)
{
$xml = new \SimpleXMLElement($data);
$foo = new Foo();
$foo->setData($xml);
echo $foo->getElement();
}
}
setData()
和fooBar()
都应该验证它们的参数吗
或者,如果只有fooBar()
验证其参数,是否可以
或者调用
foobar()
的函数是否应该验证其参数?这实际上取决于您的体系结构的具体情况。最近我开始倾向于这样的方法:
class User {
// some code
public function setEmail(EmailAddress $email) { ....
}
其基本用途是:
$bob = new User;
$bob->setEmail(new EmailAddress($param));
在这种情况下,验证实际上发生在EmailAddress
类的构造函数中,如果您试图用无效的电子邮件地址对其进行实例化,该类会引发异常
我认为它的一般术语是“价值对象”,但不要引用我的话。我一直在向推广DDD编程方法的人们借用这一点,尽管我对DDD作为一个整体存在严重的怀疑(我觉得这有点过分,同时引入了一些“跨层混淆”).因此用户类将完全依赖EmailAddress类来进行验证?其思想是您只能创建有效的
EmailAddress
实体。如果您试图创建一个无效的,它将抛出一个异常。归根结底,验证电子邮件地址不是用户
实体的责任。这是一个复杂的外部问题域。