【问题标题】:PHP: Detect instances of same classPHP:检测同一类的实例
【发布时间】:2012-01-06 14:50:07
【问题描述】:

我有一个 PHP 类,它需要在其构造函数中具有唯一值。如果同一类的多个实例传递相同的值,结果将是可怕的。

我将如何检测 Class 的其他实例,以便在构建任何新实例之前检查并防止这种情况发生?

【问题讨论】:

标签: php oop


【解决方案1】:

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

有点像..

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

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

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

【讨论】:

【解决方案2】:

我认为 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) {
    }
}

【讨论】:

  • @MarkBaker,@Rudolph,我认为这实际上不是一个正确的答案。首先,$_instances 不应该是静态的吗?其次,OP 似乎想知道是否已经存在具有该 ID 的实例 - 而不仅仅是在存在时检索它。
  • 谢谢,我自己发现了这个错误并更正了。我猜我写的就是他真正需要的,不过static public exists($id)的方法写起来还是很容易的。
  • 谢谢,这个模式让我很感兴趣。但我很困惑,因为结果似乎是 new Foo($id) 但如果在构造函数中调用它,那么这不会重新创建自身的实例并尝试再次检查它吗?除非我弄错了,否则运行脚本两次并构造两个实例来执行此检查似乎有点浪费?
  • @GEorge,不,它不会创建两个实例,因为 getInstance() 方法是静态调用的……静态调用(也包括 exists() 方法)不会除非通过“new”明确地创建一个新实例
  • 没有在构造函数中调用。 custructor 故意留空并设置为受保护/私有,因此只能从类中调用它 - getInstance()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2014-10-27
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多