这实际上是一个有趣的问题,并且有一个简单(但难看)的修复(见下文)。
所以我在问是否有更好的方法。
我想做的是让对象构造函数返回别的东西而不是新的实例。
以下是我想要实现的一个例子:
$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:不需要陈述明显的模式(工厂/单身)......
答案 0 :(得分:4)
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。如果您在技术文档(以及您的评论中)记录它,任何人都应该能够说出它是如何工作的,所以可以使用第一种方法。
第二个解决方案实际上对我来说显然不那么。