关于一个单例模式的问题,这样写为什么返回的是DB实例,而不是一个PDO实例

时间:2022-05-17 20:46:53
<?php 
class DB
{
    private static $instance; 
    private  function __construct(){
         self::$instance = new PDO("mysql:host=localhost;dbname=test;charset=utf8","root","root");
    }
    public static function getInstance(){
        if ( !self::$instance instanceof self ) {
             self::$instance = new self();
        }
        return self::$instance;
    }
    private function __clone(){}
}

$test1 = DB::getInstance();
var_dump( $test1  );


在$test1 = DB::getInstance()第一次调用这个时候,$instance没有任何属性,触发  self::$instance = new self();然后触发构造函数,为什么返回的是一个DB的实例,而不是一个PDO实例

6 个解决方案

#1


为什么会是 PDO 实例?

#2


self 中文释义:自己
在你的代码中 self 就是 DB
if ( !self::$instance instanceof self ) { 如果不是 DB 的实例
             self::$instance = new self(); 则实例化 DB
}
没有看到能残生误解的地方

#3


里面有个构造方法啊,做了一个PDO的实例化,赋值给了instantce,难道在new DB()不会触发吗?

#4


引用 2 楼 xuzuning 的回复:
self 中文释义:自己
在你的代码中 self 就是 DB
if ( !self::$instance instanceof self ) { 如果不是 DB 的实例
             self::$instance = new self(); 则实例化 DB
}
没有看到能残生误解的地方

里面有个构造方法啊,做了一个PDO的实例化,赋值给了instantce,难道在new DB()不会触发吗?

#5


先后对同一变量赋值,变量的值自然是最后赋予的那个

#6


至少得写作
    public static function getInstance(){
        if ( !self::$instance instanceof PDO ) {
             new self();
        }
        return self::$instance;
    }

#1


为什么会是 PDO 实例?

#2


self 中文释义:自己
在你的代码中 self 就是 DB
if ( !self::$instance instanceof self ) { 如果不是 DB 的实例
             self::$instance = new self(); 则实例化 DB
}
没有看到能残生误解的地方

#3


里面有个构造方法啊,做了一个PDO的实例化,赋值给了instantce,难道在new DB()不会触发吗?

#4


引用 2 楼 xuzuning 的回复:
self 中文释义:自己
在你的代码中 self 就是 DB
if ( !self::$instance instanceof self ) { 如果不是 DB 的实例
             self::$instance = new self(); 则实例化 DB
}
没有看到能残生误解的地方

里面有个构造方法啊,做了一个PDO的实例化,赋值给了instantce,难道在new DB()不会触发吗?

#5


先后对同一变量赋值,变量的值自然是最后赋予的那个

#6


至少得写作
    public static function getInstance(){
        if ( !self::$instance instanceof PDO ) {
             new self();
        }
        return self::$instance;
    }