Php 应在何处进行参数验证以避免代码重复

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->

我想知道这里有哪些最佳实践/建议。假设我有一个类提供了操作XMLElement的函数

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
实体。如果您试图创建一个无效的,它将抛出一个异常。归根结底,验证电子邮件地址不是
用户
实体的责任。这是一个复杂的外部问题域。