Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 向对象传递设置时,哪种方法更好?_Php_Oop_Design Patterns - Fatal编程技术网

Php 向对象传递设置时,哪种方法更好?

Php 向对象传递设置时,哪种方法更好?,php,oop,design-patterns,Php,Oop,Design Patterns,我想使用$config设置对象中字段的初始值。哪种方法在更干净、更易维护的代码方面更好? 另外,我想补充的是,对象将在工厂中初始化,而不是直接由客户机初始化 1。我将$config传递给对象 <?php class UserGreeting { private $config; public function __construct($config){ $this->config=$config; } public function greetings(

我想使用$config设置对象中字段的初始值。哪种方法在更干净、更易维护的代码方面更好? 另外,我想补充的是,对象将在工厂中初始化,而不是直接由客户机初始化

1。我将$config传递给对象

<?php
class UserGreeting {
  private $config;
  public function __construct($config){
      $this->config=$config;
  }

  public function greetings(){
    echo 'Hello, '.$this->config->get('username');
  }
}
?>
<?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}";
   }
  }
?>

优点:

  • 易于传递多个参数
缺点:

  • 该类与$config耦合(是吗?)。我的意思是 除了特定的$config接口和参数命名 按照惯例,我不能把这个类插入到另一个程序中 不引入$config
  • 客户端代码不必知道服务器使用了哪些参数
    对象,但这是更一般的想法
2。我在对象外部手动设置字段

<?php
class UserGreeting {
  private $config;
  public function __construct($config){
      $this->config=$config;
  }

  public function greetings(){
    echo 'Hello, '.$this->config->get('username');
  }
}
?>
<?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}";
   }
  }
?>

优点:

  • 这个班不在乎他的参数来自哪里

  • 可以很容易地重复使用

  • 更容易测试(是吗?)。我的意思是,我不必处理设置 最多$config

缺点:

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

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


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


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

考虑到您的想法,我只使用一个变量。如果你想通过每个方法传递变量,你会有很多多余的代码


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

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

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

您可以将静态类与静态方法结合使用。实际上,它们类似于常量,但您可以在静态配置类中强制执行各种规则——例如,它们符合接口

Config::getUserName();
这样,如果您将要面对一系列配置对象,您可以确保它们都至少有一个对应于每个预期值的条目,否则会抛出一条警告


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

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

Config::getUserName();
这样,如果您将要面对一系列配置对象,您可以确保它们都至少有一个对应于每个预期值的条目,否则会抛出一条警告


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

使用ctor注入的第一个解决方案。但是我只传递实际的对象,而不是一个特殊的配置。在您的例子中,是一个
用户
对象

<?php
class UserGreeting
{
    private $user;

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

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

第一种使用ctor注入的溶液。但是我只传递实际的对象,而不是一个特殊的配置。在您的例子中,是一个
用户
对象

<?php
class UserGreeting
{
    private $user;

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

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

这里正在进行一些繁重的编辑,哇!尊重编辑。你几乎重写了整件事!你已经回答了你的问题。显然,工厂解决方案是更易于维护的解决方案。只需一个侧面说明:您不需要提供setter,但可以插入$username(除非是可选值)。感谢您帮助编辑,我是第一个突出显示的人!我不将其传递给构造函数的原因是我需要多个值,单个用户名只是为了简单起见example@Boris那么,传递多个值。通过ctor传递对象需要处于有效状态的所有内容。如果您发现这会给您一个很长的参数列表,请检查是否可以将其中一些参数分组到对象中。将这些参数的创建移到工厂中,然后注入对象。但是我必须通过传递长构造函数或设置字段来初始化参数对象,不是吗?这里正在进行一些繁重的编辑,哇!尊重编辑。你几乎重写了整件事!你已经回答了你的问题。显然,工厂解决方案是更易于维护的解决方案。只需一个侧面说明:您不需要提供setter,但可以插入$username(除非是可选值)。感谢您帮助编辑,我是第一个突出显示的人!我不将其传递给构造函数的原因是我需要多个值,单个用户名只是为了简单起见example@Boris那么,传递多个值。通过ctor传递对象需要处于有效状态的所有内容。如果您发现这会给您一个很长的参数列表,请检查是否可以将其中一些参数分组到对象中。将这些对象的创建移到工厂中,然后注入对象。但是,我必须通过传递长构造函数或设置字段来初始化parameters对象,不是吗?第二种方法也使用依赖项注入。第二种方法也使用依赖项注入。这将引入大量耦合,我正在考虑