1

我正在编写一个 PDO Wrapper 作为一个学习项目,我正在尝试将它与使用依赖注入结合起来。我当前的设置有一个将设置依赖项的工厂。因此,例如,我将有一个表单类,它传入几个对象以输出 html 属性等。

我想保持这种状态,但在我的工厂类中,我只想使用每个对象的一个​​实例,而不是每次都创建一个新对象。一个例子可能会更好地解释这一点:

class Factory {

public static function Form() {

    $html = new Html;
    $form = new Form;
    $form->html = $html;
    return $form;

}

}

还有我的 HTML 类:

class HTML {

// Outputs attributes in the given array
public function attributes($attributes = array()) {

    // Create string of HTML attributes
    foreach($attributes as $key => $attribute):
        $tags .= $key . '=' . $attribute . ' ';
    endforeach;

    return $tags;

}

}

所以基本上,我想在工厂中创建一次 HTML 对象,然后将其传递给 Form 方法,该方法将创建表单并允许我访问 HTML 方法。

我假设我必须在我的工厂中设置一个构造函数来创建 HTML 对象?我从中看到的问题是,每次我运行 Factory::Form 时,都会创建一个新的 HTML 对象。有没有简单的方法解决这个问题?即当使用Factory 时,检查是否创建了HTML 对象,如果是,则使用当前的。

这可能很简单,但任何帮助都会很棒。

4

1 回答 1

1

我不确定这是否正是您的意思,但是您的工厂类可以接受Form()方法中的参数,例如

class Factory {
  public function Form(Html $html = NULL){
    if(is_null($html)){
      $html = new Html();
    }
   // etc.
}

对于另一个问题,实际上您的工厂类不需要构造函数。您只需要调用适当的方法。

编辑

我还没有意识到您的 Form 方法是静态的。我认为您还需要类中的静态字段,例如:

class Factory {
  public static $html;

  public static function Form() {

    if(is_null($this->html)){
       $this->html = new Html;
    }
    $form = new Form;
    $form->html = $this->html;
    return $form;
  }
}

请注意,在此解决方案中,使用此工厂创建的每个对象都将具有相同的$html对象!

于 2013-05-14T08:55:34.843 回答