Php 对象工厂

Php 对象工厂,php,oop,factory,Php,Oop,Factory,管理一个复杂的php oop应用程序让我有些不知所措。在过去,我对我的“utils”类使用静态方法,但我正在编写一个新的应用程序,我希望代码尽可能达到最高标准,因此我希望尽可能避免使用它们。保持可测试性等 我已经研究过依赖注入,但我计划创建一个助手类的“库”(可以这么说),我可以在项目中不费吹灰之力地插入和退出这些类。我的问题是,因为我可能有五到六个这样的对象,所以我不想设置用户需要将所有这些对象传递到的结构 我的研究把我带到了工厂——我创造了这样一只野兽,但我真的不知道这是否是正确的方式。有点

管理一个复杂的php oop应用程序让我有些不知所措。在过去,我对我的“utils”类使用静态方法,但我正在编写一个新的应用程序,我希望代码尽可能达到最高标准,因此我希望尽可能避免使用它们。保持可测试性等

我已经研究过依赖注入,但我计划创建一个助手类的“库”(可以这么说),我可以在项目中不费吹灰之力地插入和退出这些类。我的问题是,因为我可能有五到六个这样的对象,所以我不想设置用户需要将所有这些对象传递到的结构

我的研究把我带到了工厂——我创造了这样一只野兽,但我真的不知道这是否是正确的方式。有点像这样

class Create {

private static $validation = null;
private static $helper = null;
private static $html = null;
private static $form = null;
public static $user = null;
public static $db = null;

// --------------------------------------------------------------
// Initialize
// --------------------------------------------------------------

public static function load($object, $options, $dependencies = array('html', 'helper', 'db', 'user')) {

    // Create specified object (without constructor)
    // PHP version < 5.4
    $$object = self::createInstanceWithoutConstructor($object);

    // Inject specified options into new object
    foreach($dependencies as $dependency):
        if(is_null(self::$$dependency)): self::$$dependency = new $dependency; endif;
        $$object->$dependency = self::$$dependency;
    endforeach;

    // Now call the constructor
    // PHP version < 5.4
    if(method_exists($$object, '__construct')):
        $$object->__construct($options);
    endif;

    return $$object;

}

// --------------------------------------------------------------
// Create Instance of Object Without Calling it's Constructor
// --------------------------------------------------------------
// Workaround for PHP version < 5.4
// This will be updated to use
// ReflectionClass::newInstanceWithoutConstructor
// when 5.4 is more freely supported
// --------------------------------------------------------------

private static function createInstanceWithoutConstructor($class) {

    $reflector = new ReflectionClass($class);
    $properties = $reflector->getProperties();
    $defaults = $reflector->getDefaultProperties();

    $serealized = "O:" . strlen($class) . ":\"$class\":".count($properties) .':{';
    foreach ($properties as $property){
        $name = $property->getName();
        if($property->isProtected()){
                $name = chr(0) . '*' .chr(0) .$name;
            } elseif($property->isPrivate()){
                $name = chr(0)  . $class.  chr(0).$name;
            }
            $serealized .= serialize($name);
            if(array_key_exists($property->getName(),$defaults) ){
                $serealized .= serialize($defaults[$property->getName()]);
            } else {
                $serealized .= serialize(null);
            }
        }
    $serealized .="}";

    return unserialize($serealized);

}

// --------------------------------------------------------------
// Create User
// --------------------------------------------------------------

public static function User($options = array()) {

    $user = self::load(__FUNCTION__, $options);
    return $user;

}

// --------------------------------------------------------------
// Create Page
// --------------------------------------------------------------

public static function Page($options = array()) {

    $page = self::load(__FUNCTION__, $options);
    return $page;

}

// --------------------------------------------------------------
// Create Form
// --------------------------------------------------------------

public static function Form($name, $method = 'POST', $action = null, $attributes = array()) {

    // Check to see if form was submitted
    // If so, get form object, otherwise create new form object
    if(isset($_POST[$name])):
        $form = unserialize($_SESSION['formObj']);
        $form->errors = array();
        $form->rule = $form->rule;
        $form->labels = $form->labels;
        $form->errors = $form->errors;
    else:
        $form = self::load(__FUNCTION__, array(), array('html', 'validation'));
        $form->name = $name;
    endif;

    // Open the form
    $form->open($method, $action, $attributes);

    return $form;

}

}
类创建{
私有静态$validation=null;
私有静态$helper=null;
私有静态$html=null;
私有静态$form=null;
公共静态$user=null;
公共静态$db=null;
// --------------------------------------------------------------
//初始化
// --------------------------------------------------------------
公共静态函数加载($object,$options,$dependencies=array('html','helper','db','user')){
//创建指定的对象(不带构造函数)
//PHP版本<5.4
$$object=self::CreateInstancewithout构造函数($object);
//将指定的选项注入新对象
foreach($dependencies作为$dependency):
if(为null(self:$$dependency)):self::$$dependency=new$dependency;endif;
$$object->$dependency=self::$$dependency;
endforeach;
//现在调用构造函数
//PHP版本<5.4
如果(方法_存在($$object,'._-construct')):
$$object->\u构造($options);
endif;
返回$$对象;
}
// --------------------------------------------------------------
//创建对象的实例而不调用其构造函数
// --------------------------------------------------------------
//PHP版本<5.4的变通方法
//这将被更新以使用
//ReflectionClass::newInstanceWithoutConstructor
//当5.4得到更自由的支撑时
// --------------------------------------------------------------
私有静态函数createInstanceWithoutConstructor($class){
$reflector=新的ReflectionClass($class);
$properties=$reflector->getProperties();
$defaults=$reflector->getDefaultProperties();
$serealized=“O:“.strlen($class)。”:\“$class\”:“.count($properties)。”:{;
foreach($properties作为$property){
$name=$property->getName();
如果($property->isProtected()){
$name=chr(0)。'*'.chr(0)。$name;
}elseif($property->isPrivate()){
$name=chr(0)。$class.chr(0)。$name;
}
$serealized.=序列化($name);
如果(数组\键\存在($property->getName(),$defaults)){
$serealized.=序列化($defaults[$property->getName());
}否则{
$serealized.=序列化(空);
}
}
$serealized.=“}”;
返回未序列化($serealized);
}
// --------------------------------------------------------------
//创建用户
// --------------------------------------------------------------
公共静态函数用户($options=array()){
$user=self::load(_函数_$options);
返回$user;
}
// --------------------------------------------------------------
//创建页面
// --------------------------------------------------------------
公共静态函数页($options=array()){
$page=self::load(_函数__,$options);
返回$page;
}
// --------------------------------------------------------------
//创建表单
// --------------------------------------------------------------
公共静态函数形式($name,$method='POST',$action=null,$attributes=array()){
//检查表单是否已提交
//如果是,则获取表单对象,否则创建新表单对象
如果(isset($\u POST[$name])):
$form=unserialize($_SESSION['formObj']);
$form->errors=array();
$form->rule=$form->rule;
$form->labels=$form->labels;
$form->errors=$form->errors;
其他:
$form=self::load(_函数,数组(),数组('html','validation');
$form->name=$name;
endif;
//打开表单
$form->open($method、$action、$attributes);
返回$表格;
}
}
因此,它有单独的函数来创建各种对象,除非明确设置了依赖项,否则会传入一个默认选择

现在,我真的不确定这是否是一种好的方法,从更多的研究中,我收集到一个更好的主意,就是为每个类创建一个工厂,负责在该类中创建对象。这是更“正确”的方法吗?如果是这样,那么这些工厂方法(不确定这是否是正确的术语?)应该是可以在任何地方调用的静态方法,还是可以是创建新对象然后传入的普通方法?这是否也需要扩展一个保存已创建对象的“Factory”类

希望一切都有意义,任何和所有的帮助都将被感激

你的


困惑的N00b。

看着你的代码,阅读你的帖子,我觉得你把事情复杂化了

你不需要关注做某事的“正确”方式。做某事的正确方式是最适合您给定场景的方式。看看你需要做什么,展望未来(但不要太远!!),试着找到一个不是过度设计的解决方案,而是给你成长的空间

我说不太遥远的未来,因为开发人员往往过于沉迷于他们的设计,试图为每一个可能的结果进行规划,最终你会遇到一个无法维护的怪物

如果一系列工厂功能c