Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHPOOP:避免域模型模式中的单例/静态方法_Php_Oop_Model_Singleton_Dns - Fatal编程技术网

PHPOOP:避免域模型模式中的单例/静态方法

PHPOOP:避免域模型模式中的单例/静态方法,php,oop,model,singleton,dns,Php,Oop,Model,Singleton,Dns,我理解依赖注入的重要性及其在单元测试中的作用,这就是为什么下面的问题让我停了下来: 我努力不使用单例的一个领域是身份映射/工作单元模式(它保持对域对象状态的选项卡) 你对如何处理这种情况有什么建议吗 我不愿意将映射器/数据库访问的实例传递/生成到域对象本身,以同时满足DI-的要求,从而避免在域对象内大量调用外部静态方法 虽然我想如果我想“保存”成为其行为的一部分,那么在其建设中需要一个这样做的设施。也许这是责任的问题,域对象不应该承担保存的负担。这只是Active Record模式的一个非常简洁

我理解依赖注入的重要性及其在单元测试中的作用,这就是为什么下面的问题让我停了下来:

我努力不使用单例的一个领域是身份映射/工作单元模式(它保持对域对象状态的选项卡)

你对如何处理这种情况有什么建议吗

我不愿意将映射器/数据库访问的实例传递/生成到域对象本身,以同时满足DI-的要求,从而避免在域对象内大量调用外部静态方法


虽然我想如果我想“保存”成为其行为的一部分,那么在其建设中需要一个这样做的设施。也许这是责任的问题,域对象不应该承担保存的负担。这只是Active Record模式的一个非常简洁的特性——以某种方式实现它会很好。

我所做的,尽管可能不是最好的做法,是为我的类建立一个明确的命名约定,FI:
user\u user
是域对象,
user\u mapper\u user
是它的映射器

在我的父类
domainObject
class中,我对逻辑进行编码以找到它的映射器


然后,您有几个选项可以委托给它,一个明显的选项是使用
domainObject

中的
\u call()
方法当然,我也是这样做的。问题在于:您是创建映射器的新实例,还是对存在于用户外部的映射器进行静态调用(假设用户映射器必须已经存在,才能存在用户)?因为如果你调用一个新的映射程序,你可能需要调用一个新的DB句柄,加上对工作单元和ID映射的引用…-虽然外部类已经有了所有这些设置,但我将DB句柄(在我的例子中是MDB2)静态存储在父映射器类中,因此无论我有多少个映射器实例,它们都共享相同的句柄。啊,我现在明白了,这是一个单状态类模式,不是吗?我不知道这是一个模式。但显然是的。谢谢你让我知道:)
//Not actual code, but it should demonstrate the point    

class Monitor{//singleton construction omitted for brevity
    static $members = array();//keeps record of all objects
    static $dirty = array();//keeps record of all modified objects
    static $clean = array();//keeps record of all clean objects
}

class Mapper{//queries database, maps values to object fields
    public function find($id){
        if(isset(Monitor::members[$id]){
        return Monitor::members[$id];
    }
    $values = $this->selectStmt($id);
    //field mapping process omitted for brevity
    $Object = new Object($values);
    Monitor::new[$id]=$Object
    return $Object;
}

$User = $UserMapper->find(1);//domain object is registered in Id Map
$User->changePropertyX();//object is marked "dirty" in UoW

// at this point, I can save by passing the Domain Object back to the Mapper
$UserMapper->save($User);//object is marked clean in UoW

//but a nicer API would be something like this
$User->save();

//but if I want to do this - it has to make a call to the mapper/db somehow    
$User->getBlogPosts();

//or else have to generate specific collection/object graphing methods in the mapper
$UserPosts = $UserMapper->getBlogPosts();
$User->setPosts($UserPosts);