PHP OO取消构建

时间:2010-11-01 07:28:52

标签: php oop caching constructor

这实际上是一个有趣的问题,并且有一个简单(但难看)的修复(见下文)。

所以我在问是否有更好的方法。

我想做的是让对象构造函数返回别的东西而不是新的实例。

以下是我想要实现的一个例子:

$GLOBALS['object_cache']=array();

class Test {
    public function __construct($id=0){
        if(isset( $GLOBALS['object_cache'][$id] ))
            return $GLOBALS['object_cache'][$id];
        $GLOBALS['object_cache'][$id]=$this;
    }
}

$t0=new Test(0);
$t1=new Test(1);
$t01=new Test(0);
// modifying $t01 would presumably also modify $t0

简单(但丑陋?)修复:

$GLOBALS['object_cache']=array();

class Test {
    public static function create($id=0){
        if(isset( $GLOBALS['object_cache'][$id] ))
            return $GLOBALS['object_cache'][$id];
        $new=new Test();
        $GLOBALS['object_cache'][$id]=$new;
        return $new;
    }
}

$t0=Test::create(0);
$t1=Test::create(1);
$t01=Test::create(0);
// modifying $t01 would presumably also modify $t0

你们觉得怎么样?顺便说一下,例1不起作用;无论return语句如何,它都会返回一个新实例。

我错过了什么,或者是第二个更好的方式?

PS:不需要陈述明显的模式(工厂/单身)......

3 个答案:

答案 0 :(得分:4)

  1. OMG。构造函数不能返回任何内容。
  2. 它被称为工厂方法模式http://en.wikipedia.org/wiki/Factory_method_pattern,它是实例化对象的常见做法。
  3. ps:将实例存储在static类变量中,第二种解决方案不会像现在这样奇怪。

答案 1 :(得分:2)

您还可以使用程序版本:

class Test {
    function __construct($i) {}
}
function Test($i) {
    static $cache;
    if (isset($cache[$i])) {
        return $cache[$i];
    }
    else { 
        return $cache[$i] = new Test($i);
    }
}

它的眼睛稍微好一点,并允许例如即时流畅的Test(1)->do()->else()电话。

答案 2 :(得分:1)

基本上您要做的是实施Singleton pattern并结合Factory method pattern。如果您在技术文档(以及您的评论中)记录它,任何人都应该能够说出它是如何工作的,所以可以使用第一种方法。

第二个解决方案实际上对我来说显然不那么。