不能确保在单例模式下只创建一个实例


can't make sure only one instance is created in singleton pattern

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

$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;
?>

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

class Singleton {
    protected __construct() {}
    public static getInstance() {
        ...
    }
}

话虽如此,像这样强制执行单例很少是一个好主意。更好的想法是简单地实例化类一次,并在需要时通过依赖注入传递它;管理实例化和传递的依赖注入容器在这里很有帮助。