【问题标题】:An error in my singleton method, when create an instance. I want one instance only创建实例时,我的单例方法中出现错误。我只想要一个实例
【发布时间】:2013-06-04 11:40:34
【问题描述】:

我有下面的注册类来创建一个实例并将其保存到数组中。

// The register class
class Register {

    private static $objects = array();
    private function __construct() {}

    private function __clone() {}

    public static function Singleton($class) {
        if (in_array($class, self::$objects)) {
            return self::$objects[$class];
        }
        return self::$objects[$class] = new $class();
        }
}

// Example
class examp {
    public static function Singleton() {
        return Register::Singleton(get_class());
    }

    public function message() {
        echo "Hello";
    }
}

$var = examp::Singleton();
$var2 = examp::Singleton();

// I'm using that way to make sure, but tell me false
if($var === $var2){
   echo "Yes";
} else {
   echo "No";
}

当我确定 $var 是否获得相同的 $var2 实例时,请告诉我是否为假。
我想知道为什么 $var 和 $var2 没有得到相同的实例,我的 Register 类有什么问题?

【问题讨论】:

  • in_array($class, self::$objects) 似乎不起作用
  • 我看到您删除了有关限制对 Web 服务器上文件的访问的问题。我一般不建议人们这样做,因为这会给已经回答和正在回答的人带来不便。
  • 这是我的评论:这不是很清楚,但我想我已经解决了。如果一个文件被浏览器读取,应该阻止它被读取,但是如果它是通过程序读取的,它应该被允许吗?好吧,您可以查看用户代理字符串,但这可能是伪造的。您能否详细说明您要达到的目标?也许它可以做得更好(更安全)。

标签: php singleton instance


【解决方案1】:

您检查是否有值,但您应该检查键。

你不应该使用in_array()函数,而是使用array_key_exists()

来自 PHP 手册:

改变

if (in_array($class, self::$objects)) {

 if (array_key_exists($class, self::$objects)) {

Working demo

【讨论】:

  • 太好了,谢谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多