我正在写一个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对象,如果创建了,则使用当前对象。
我不确定是否正是你的意思,但是你的工厂类可以接受Form()
方法中的参数,如
class Factory {
public function Form(Html $html = NULL){
if(is_null($html)){
$html = new Html();
}
// etc.
}
对于另一个问题,实际上工厂类不需要构造函数。您只需要调用适当的方法。
编辑我还没有意识到你的表单方法是静态的。我认为你还需要类中的静态字段,如:
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
对象!