将设置传递给对象时,哪种方法更好


Which approach is better when passing settings to an object?

我想使用$config设置对象中字段的初始值。哪一种方法在代码清洁度和可维护性方面更好?另外,我想补充的是,对象将在工厂中初始化,而不是由客户端直接初始化。

1。我将$config传递给对象

<?php
class UserGreeting {
  private $config;
  public function __construct($config){
      $this->config=$config;
  }
  public function greetings(){
    echo 'Hello, '.$this->config->get('username');
  }
}
?>

优点:

  • 易于传递多个参数

缺点:

  • 类与$config耦合(是吗?)我的意思是除了特定的$config接口和参数命名我不能把这个类插入到另一个程序中不引入$config
  • 客户端代码不需要知道
    使用了哪些参数对象,但这是更普遍的想法

2。我在对象

之外手动设置字段
<?php
class UserGreetingFactory{
   public function __construct($config){
     $this->config=$config;
   }
   public function getUserGreeting(){
     $userGreeting=new UserGreeting();
     $userGreeting->setUserName='John Doe';
     return $userGreeing;
   }
} 
class UserGreeting {
   private userName;
   public function setUserName($userName){
     $this->userName=$userName;
   }
   public function greetings(){
     echo "Hello, {$this->userName}";
   }
  }
?>

优点:

  • 类不关心他的参数来自哪里

  • 可轻松重复使用

  • 更容易测试(是吗?)我的意思是我不需要处理设置美元配置

缺点:

  • Factory'Builder必须知道传递哪些参数

  • 设置和传递参数的大量额外代码

第一个注射药物的溶液。而不是一个特殊的配置,我将只是传递实际的对象。在您的例子中是User对象。

<?php
class UserGreeting
{
    private $user;
    public function __construct(User $user)
    {
        $this->user = $user;
    }
    public function greet()
    {
        printf('Hello, %s!',  $this->user->getName());
    }
}

考虑到你的想法,我坚持使用单个变量。如果你想每个方法传递变量,你就会有很多多余的代码。

从面向对象的角度来看,您不应该将其放在单个变量中。对象具有属性。用户名实际上是一个属性,因此您应该将其作为属性使用。这意味着在PHP类中,您需要将其设置为公共变量,并在创建对象时设置变量。

由于依赖注入,第一种方法更好。这段代码将更容易测试和维护。第三种方法是使用访问者模式注入依赖项。

您可以使用带有静态方法的静态类。实际上,它们类似于CONSTS,但是你可以在静态配置类中强制执行各种规则——例如,它们符合一个接口。

Config::getUserName();

这样,如果你要面对一组配置对象,你可以保证它们至少有一个条目对应每个期望的值——否则会抛出一个警告。

当然,

可能取决于您的情况,我希望在许多情况下您不想这样做-但我还是会提供它。