【发布时间】:2012-01-06 14:50:07
【问题描述】:
我有一个 PHP 类,它需要在其构造函数中具有唯一值。如果同一类的多个实例传递相同的值,结果将是可怕的。
我将如何检测 Class 的其他实例,以便在构建任何新实例之前检查并防止这种情况发生?
【问题讨论】:
我有一个 PHP 类,它需要在其构造函数中具有唯一值。如果同一类的多个实例传递相同的值,结果将是可怕的。
我将如何检测 Class 的其他实例,以便在构建任何新实例之前检查并防止这种情况发生?
【问题讨论】:
一个简单的解决方案是在类中保留一个静态值数组。然后,当创建一个新实例时,在构造函数中检查静态数组的内容。
有点像..
class Foo {
private static $usedValues = array();
public function __construct($val) {
if(in_array($val, self::$usedValues)) {
throw new Exception('blah');
}
self::$usedValues[] = $val;
}
}
【讨论】:
我认为 multiton 模式适合你。
class Foo {
static protected $_instances = array();
static public function getInstance($id) {
if(!self::exists($id)) {
self::$_instances[$id] = new Foo($id);
}
return self::$_instances[$id];
}
static public function exists($id) {
return isset(self::$_instances[$id]);
}
protected function __construct($id) {
}
}
【讨论】:
$_instances 不应该是静态的吗?其次,OP 似乎想知道是否已经存在具有该 ID 的实例 - 而不仅仅是在存在时检索它。
static public exists($id)的方法写起来还是很容易的。
new Foo($id) 但如果在构造函数中调用它,那么这不会重新创建自身的实例并尝试再次检查它吗?除非我弄错了,否则运行脚本两次并构造两个实例来执行此检查似乎有点浪费?
getInstance()。