Php 向对象传递设置时,哪种方法更好?
我想使用$config设置对象中字段的初始值。哪种方法在更干净、更易维护的代码方面更好? 另外,我想补充的是,对象将在工厂中初始化,而不是直接由客户机初始化 1。我将$config传递给对象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(
<?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
- 客户端代码不必知道服务器使用了哪些参数
对象,但这是更一般的想法
<?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对象,不是吗?第二种方法也使用依赖项注入。第二种方法也使用依赖项注入。这将引入大量耦合,我正在考虑