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

时间:2011-09-28 10:11:13

标签: php oop design-patterns

我想使用$ 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}";
   }
  }
?>

优点:

  • 该课程并不关心他的参数来自哪里

  • 可以轻松重复使用

  • 更容易测试(是吗?)。我的意思是我不需要处理设置 up $ config

缺点:

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

  • 有很多额外的代码和传递参数代码

4 个答案:

答案 0 :(得分:1)

首次使用ctor注射液。但是,我只会传递实际的对象而不是特殊的配置。在您的情况下,User对象。

<?php
class UserGreeting
{
    private $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function greet()
    {
        printf('Hello, %s!',  $this->user->getName());
    }
}

答案 1 :(得分:0)

考虑到你的想法,我会坚持一个变量。如果你想传递每个方法的变量,你会有很多过多的代码。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以使用静态方法的静态类。实际上它们就像CONSTS,但您可以在静态配置类中强制执行各种规则 - 例如它们符合接口。

Config::getUserName();

这样一来,如果您要面对一系列配置对象,您可以放心,他们都至少有一个每个预期值的条目 - 否则会发出警告。

当然可能取决于你的情况,我希望在很多情况下你不想这样做 - 但我会一直提供它。