我想使用$ config设置对象中字段的初始值。哪种方法在更清晰,更易维护的代码方面更好? 另外,我想补充说,对象将在工厂初始化,而不是由客户端直接初始化。
1。我将$ config传递给对象
<?php
class UserGreeting {
private $config;
public function __construct($config){
$this->config=$config;
}
public function greetings(){
echo 'Hello, '.$this->config->get('username');
}
}
?>
优点:
缺点:
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必须知道要传递哪些参数
有很多额外的代码和传递参数代码
答案 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();
这样一来,如果您要面对一系列配置对象,您可以放心,他们都至少有一个每个预期值的条目 - 否则会发出警告。
当然可能取决于你的情况,我希望在很多情况下你不想这样做 - 但我会一直提供它。