2012-01-06 27 views
1

我有一个PHP类,它的构造函数需要一个唯一的值。如果同一个类的多个实例传递相同的值,那么结果是可怕的。PHP:检测同类的实例

我该如何去探测一个类的其他实例,以便在构建任何新实例之前检查并防止发生这种情况?

+0

http://stackoverflow.com/questions/475569/get-all-instances-of-a-class-in-php – kba 2012-01-06 14:55:34

回答

4

一个简单的解决方案是保持类中的值的静态数组。然后,当创建一个新实例时,检查构造函数中静态数组的内容。

喜欢的东西..

class Foo { 
    private static $usedValues = array(); 

    public function __construct($val) { 
     if(in_array($val, self::$usedValues)) { 
      throw new Exception('blah'); 
     } 

     self::$usedValues[] = $val; 
    } 
} 
+0

+1的可能重复我正要写同样的事情。 [这是另一个实现示例](http://stackoverflow.com/a/475613/453331)。 – kba 2012-01-06 14:54:57

+0

这么简单但很聪明,谢谢!我知道静态存在的原因是:D – 2012-01-06 15:05:36

2

我想多例模式是适合你的。

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) { 
    } 
} 
+0

对于真正的稀有模式+1(和正确的答案) – 2012-01-06 15:01:37

+0

@MarkBaker,@Rudolph,我不认为这实际上是一个正确的答案。首先,'$ _instances'不应该是静态的吗?其次,OP似乎想知道一个实例是否已经存在这个ID - 如果它存在,不仅仅是检索它。 – kba 2012-01-06 15:03:45

+0

谢谢,我只是发现自己的错误,并纠正它。我在猜测我写的是他真正需要的东西,但是'static public exists($ id)'方法很容易写出来。 – 2012-01-06 15:06:28