我有一個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