PHP - 处理其他参数

时间:2017-06-01 07:14:42

标签: php oop arguments overloading

考虑以下情况:

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

捕获那些不必要的参数,因为我知道它每次都会得到那些额外的参数。或者现有代码是否足够?

2 个答案:

答案 0 :(得分:1)

如果传入的函数比函数定义中要求的多,那么这些额外的变量将被忽略(示例:https://3v4l.org/fNfAQ)。

但这可能表明您正试图对这个特定的工厂做太多事情,并且使用DI容器可能会有更好的结果。

或者您可能需要拥有单独的工厂,用于创建具有不同依赖关系的实例,而不是让“制造一切”工厂。

答案 1 :(得分:0)

&lt; p&gt;您可以为所有构造函数使用关联数组,而不是传递单独的参数。&lt; / p&gt; &lt; pre&gt;&lt; code&gt;类A {     私人$ x;     public function __construct($ params){         $ this-&gt; x = $ params [&#39; x&#39;];     }     public function display(){         echo&#34;&lt; pre&gt; $ this-&gt; x&lt; / pre&gt;&#34 ;;     } } B级{     私人$ x;     私人$ y;     私人$ z;     public function __construct($ params){         $ this-&gt; x = $ params [&#39; x&#39;];         $ this-&gt; y = $ params [&#39; y&#39;];         $ this-&gt; z = $ params [&#39; z&#39;];     }     public function display(){         echo&#34;&lt; pre&gt; $ this-&gt; x&lt; / pre&gt;&#34 ;;         echo&#34;&lt; pre&gt; $ this-&gt; y&lt; / pre&gt;&#34 ;;         echo&#34;&lt; pre&gt; $ this-&gt; z&lt; / pre&gt;&#34 ;;     } } &LT; /代码&GT;&LT; /预&GT; &lt; p&gt;然后工厂可以:&lt; / p&gt; &lt; pre&gt;&lt; code&gt; public function create($ instance){     返回新的$ instance(数组(&#39; x&#39; =&gt; $ this-&gt; x,&#39; y&#39; =&gt; $ this-&gt; y,&#39; z&#39 ; =&gt; $ this-&gt; z)); } &LT; /代码&GT;&LT; /预&GT;