我想使用$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();
这样,如果你要面对一组配置对象,你可以保证它们至少有一个条目对应每个期望的值——否则会抛出一个警告。
当然,可能取决于您的情况,我希望在许多情况下您不想这样做-但我还是会提供它。