通过依赖注入将参数传递给__construct

时间:2014-03-03 08:13:48

标签: php constructor setter

我正在创建一个User类,它应该是一个Entity类。在DataBase中,我创建了User表,它有20个字段。

我的问题是:用20个参数创建一个“__construct()”还是应该用户setter / getter?

我最近阅读了一些关于依赖注入的文章,以及它如何使代码更易于维护,但我对自己的代码感到困惑。 这是我的__construct函数:

class User{ 
    private     $userName;
    private     $userLastName;
    ...//Other users fields

    public function __construct($name,$lastname,$phone,...){
           $this->userName = $name;
           $this->userLastName = $lastname;
           ...
    }

}

我正在寻找最佳实践来编写一些可读,干净和可维护的代码。

此致

3 个答案:

答案 0 :(得分:1)

这与依赖注入无关。在这里,您不会注入依赖项,而只是注入值。

所以真正的问题是:你应该在构造函数中获取这些值,还是通过getter / setter获取这些值?

我会说使用你的构造函数是一件好事,因为它可以防止你的模型以无效状态存在。例如,如果您的用户需要收到电子邮件,那么通过将其放入构造函数中,您可以确保所有用户都有电子邮件。

所以我建议你在构造函数中放入需要定义的所有属性(非null),并为所有其他属性使用setter(这将有助于避免使用20个参数构造函数)。

答案 1 :(得分:1)

通过使用20个参数,您的课程很可能违反Single Responsibility Principle并形成某种单一类而没有正确委派,编写功能。

确保你的班级具有低耦合和高凝聚力。

请参阅http://500internalservererror.wordpress.com/2009/02/23/what-do-low-coupling-and-high-cohesion-mean-what-does-the-principle-of-encapsulation-mean/

由于我们未在此处进行完整的代码审核(请转至https://codereview.stackexchange.com/

我怀疑你传递的是国家,拉链,电话号码等所有参数。 问问自己构建有效对象绝对需要哪些数据。

如果你有一个类Person需要一个名为Name的属性,那么拥有Name但不是ctor参数的setter可以创建不完整的类。这会将保持一致性的负担转移到每个方法,因为您无法确定Name已设置。这样的代码很糟糕,通常会导致携带一些“初始化”标志或函数,并使用支票使代码混乱。

您的ctor应包含最少的参数集。其他一切都可以通过属性完成或进一步组合,例如一个Address类消除了在父母ctor中传递zip,state,street等的复杂性。 您可以创建一个存储电子邮件和电话号码的“联系”类

答案 2 :(得分:0)

最好使用getter和setter。具有20个参数的__construct方法是巨大的。如果没有getter,您希望如何访问您的私人用户属性?

相关问题