2012-01-06 59 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