【问题标题】:PDO Wrapper Class - If Connected CheckPDO 包装类 - 如果已连接检查
【发布时间】:2013-05-14 08:48:16
【问题描述】:

我正在编写一个 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 对象,如果是,则使用当前的。

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

【问题讨论】:

    标签: php dependency-injection constructor factory


    【解决方案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 对象!

    【讨论】:

    • 我认为您的编辑绝对是我所追求的。我已经按照您的方式完成了,但是将 if 语句放入另一个方法中 - 然后我只是在 Form 方法中调用它。完全按照预期工作。感谢您的快速回复!
    猜你喜欢
    • 2013-08-16
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多