我正在编写一个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;
}
}
基本上,我想在Factory中创建一次HTML对象,然后将其传递给Form方法,这将创建表单并允许我访问HTML方法。
我假设我必须在我的工厂中设置一个构造函数来创建HTML对象?我从中看到的问题是每次运行Factory :: Form时,都会创建一个新的HTML对象。有一个简单的方法吗?即,当使用Factory时,检查是否创建了HTML对象,如果是,则使用当前的对象。
这可能很简单,但任何帮助都会很棒。
答案 0 :(得分: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
对象!