class A
{
public function doIt($c)
{
if (rand(0,1) == 1) // this means, we dont know if we need to create the object or not
{
$b = new B($c);
}
}
}
class B
{
}
class C
{
}
$c = new C();
$a = new A();
$a->doIt($c);
问题是,A
不需要$c
或了解C
。不过,我们必须通过它来处理B
。这不是一个坏兆头吗?我认为是,因为A
与B
无关。
答案 0 :(得分:1)
您可以通过采用dependency injection模式来改进这一点。这样A
实例不需要知道$c
,甚至不需要知道如何创建B
实例。
相反,您将为A
实例提供注入器功能,即A
需要调用的回调以获取B
的实例
这样您也不会失去原始代码中的优势:B
的实例仅在需要时创建。但是这个优势也扩展到C
实例的创建:它只在需要时创建:
class A {
public function doIt(Callable $factory) {
$b = 'nothing';
if (rand(0,1) == 1) {
// Call the callback to get the B instance:
$b = $factory();
}
// other code...
//
return $b;
}
}
class B { }
class C { }
$a = new A();
$b = $a->doIt(function () {
$c = new C();
return new B($c);
});
var_dump($b);
注意:如果您只需要A
执行此类操作,则可以考虑将doIt
方法创建为static
方法。然后,您不需要实际创建A
的实例:
class A {
public static function doIt(Callable $factory) {
// ...etc
}
// ...
$b = A::doIt(function () {
return new B(new C());
});