无法确保仅以单例模式创建一个实例

时间:2016-09-24 11:58:46

标签: php design-patterns singleton

我正在尝试创建一个可以实例化一次的类。

$ins1,$ins4,$ins3 

以这样的方式创建:如果已经定义了静态变量$ instance,它将一次又一次地返回。

$ins1==$ins4 returns true
使用$ins4,$ins5关键字创建

实例new。当我使用

$ins4==$ins5

它还返回 ture 如何确定只创建了一个实例

<?php
class Singleton{

     private static $instance;

       public static function getInstance(){

            if(!self::$instance){
                echo " I AM THE FIRST INSTANCE and i am not from bypass<br>";
                self::$instance = new Singleton();
                return self::$instance;
            }else{
                echo "i am from bypass<br>";
                return self::$instance;
            }
       }

}

$ins1 = Singleton::getInstance();
$ins2 = Singleton::getInstance();
echo $ins1==$ins2;
echo '<br>';
$ins3 = Singleton::getInstance();

$ins4 = new Singleton();
$ins5 = new Singleton();

echo $ins4 == $ins5;
?>

1 个答案:

答案 0 :(得分:2)

您需要制作构造函数protectedprivate,否则任何人都可以调用它:

class Singleton {
    protected __construct() {}

    public static getInstance() {
        ...
    }
}

话虽如此,强制执行这样的单身人士并不是一个好主意。更好的想法是简单地只对类进行一次实例化,并根据需要通过依赖注入传递它;管理实例化和传递的依赖注入容器在这里很有用。