2013-05-14 52 views
1

我正在编写一个PDO包装作为一个学习项目的一点,我试图结合使用依赖注入。我目前的设置有一个工厂,将设置依赖关系。所以,例如,我将有一个表单类,它传递几个对象来输出HTML属性等。PDO包装类 - 如果连接检查

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

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对象,然后传递通过对表格的方法,它将创建表单并允许我访问HTML方法。

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

这可能很简单,但任何帮助将是伟大的。

回答

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对象!

+0

我认为你的编辑绝对是我在这之后。我已经完成了,但是把if语句放到另一个方法中 - 然后我只是在Form方法中调用它。完全按照预期工作。感谢您的快速回复! – 0Neji 2013-05-14 10:27:05