考虑以下情况:
class Factory {
private $x = 1;
private $y = 2;
private $z = 3;
public function create(string $instance) {
return new $instance($this->x, $this->y, $this->z);
}
}
class A {
private $x;
public function __construct ($x) {
$this->x = $x;
}
public function display() {
echo "<pre>$this->x</pre>";
}
}
class B {
private $x;
private $y;
private $z;
public function __construct ($x, $y, $z) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
public function display() {
echo "<pre>$this->x</pre>";
echo "<pre>$this->y</pre>";
echo "<pre>$this->z</pre>";
}
}
$factory = new Factory;
$a = $factory->create("A");
$a->display();
$b = $factory->create("B");
$b->display();
如您所见,工厂在创建新实例时将始终提供3 arguments
。但是在class A
中,构造函数只需要1 argument
。由于php没有通常的方法重载,所以这不会引起问题。但为了安全起见,我应该在contructor
的{{1}}添加参数列表参数,例如:
class A
捕获那些不必要的参数,因为我知道它每次都会得到那些额外的参数。或者现有代码是否足够?
答案 0 :(得分:1)
如果传入的函数比函数定义中要求的多,那么这些额外的变量将被忽略(示例:https://3v4l.org/fNfAQ)。
但这可能表明您正试图对这个特定的工厂做太多事情,并且使用DI容器可能会有更好的结果。
或者您可能需要拥有单独的工厂,用于创建具有不同依赖关系的实例,而不是让“制造一切”工厂。
答案 1 :(得分:0)