我有一个PHP类,它的构造函数需要一个唯一的值。如果同一个类的多个实例传递相同的值,那么结果是可怕的。PHP:检测同类的实例
我该如何去探测一个类的其他实例,以便在构建任何新实例之前检查并防止发生这种情况?
我有一个PHP类,它的构造函数需要一个唯一的值。如果同一个类的多个实例传递相同的值,那么结果是可怕的。PHP:检测同类的实例
我该如何去探测一个类的其他实例,以便在构建任何新实例之前检查并防止发生这种情况?
一个简单的解决方案是保持类中的值的静态数组。然后,当创建一个新实例时,检查构造函数中静态数组的内容。
喜欢的东西..
class Foo {
private static $usedValues = array();
public function __construct($val) {
if(in_array($val, self::$usedValues)) {
throw new Exception('blah');
}
self::$usedValues[] = $val;
}
}
+1的可能重复我正要写同样的事情。 [这是另一个实现示例](http://stackoverflow.com/a/475613/453331)。 – kba 2012-01-06 14:54:57
这么简单但很聪明,谢谢!我知道静态存在的原因是:D – 2012-01-06 15:05:36
我想多例模式是适合你的。
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) {
}
}
对于真正的稀有模式+1(和正确的答案) – 2012-01-06 15:01:37
@MarkBaker,@Rudolph,我不认为这实际上是一个正确的答案。首先,'$ _instances'不应该是静态的吗?其次,OP似乎想知道一个实例是否已经存在这个ID - 如果它存在,不仅仅是检索它。 – kba 2012-01-06 15:03:45
谢谢,我只是发现自己的错误,并纠正它。我在猜测我写的是他真正需要的东西,但是'static public exists($ id)'方法很容易写出来。 – 2012-01-06 15:06:28
http://stackoverflow.com/questions/475569/get-all-instances-of-a-class-in-php – kba 2012-01-06 14:55:34