单身和子类

时间:2013-03-19 02:09:10

标签: php pdo singleton multiple-instances

我正在使用PHP中的OOP项目。

问题在于,当我尝试从抽象类中实例化两个子类时,只有第一个实例而不是两个实例。

database.php中:

abstract class DataBase {

    private $_connection;

    private static $_singleton = false;

    /**
     * Fetch an instance of the class.
     */
    public final static function connect () {
        if ( self::$_singleton === false ) {
            self::$_singleton = new static();
        }

        return self::$_singleton;
    }
}

UserDataBaseManager.php:

require_once 'DataBase.php';

class UserDataBase extends DataBase { (...) }

ImageDataBaseManager.php:

require_once 'DataBase.php';

class UserDataBase extends DataBase { (...) }

所以,当我试图实例化ImageDataBase和UserDataBase时:

$imageDB = ImageDataBaseManager::connect();
$userDB = UserDataBase::connect();
var_dump($userDB);

这打印:

object(ImageDataBaseManager)#2 (1) { ["_connection":"DataBase":private]=> object(PDO)#3 (0) { } } 

所以我只获得了第一个类实例,但我想要两者。

我该如何解决?

2 个答案:

答案 0 :(得分:1)

当你启动一个新的ImageDataBaseManager时,它将对象存储在抽象类的$ _singleton中,下次UserDataBase :: connect请求它返回一个新实例(静态属性不依赖于实例)。因此,对单例模式进行子类化可能不是一个好主意。但是要使其工作,您需要在子类中存储实例而不是父类。父类及其静态属性对于两者都是通用的(在运行时)。请参阅此代码。子类有自己的$ _singleton来存储实例。

abstract class DataBase {

    private $_connection;

    protected static $_singleton = false;

    /**
     * Fetch an instance of the class.
     */
    public final static function connect () {
        if ( static::$_singleton === false ) {
            static::$_singleton = new static();
        }

        return static::$_singleton;
    }
}

class UserDataBase extends DataBase { protected static $_singleton = false; }

class ImageDataBaseManager extends DataBase { protected static $_singleton = false; }

$imageDB = ImageDataBaseManager::connect();
$userDB = UserDataBase::connect();
var_dump($userDB);

答案 1 :(得分:0)

试试这个:

protected static $_singleton = false;

public final static function connect () {
    if ( static::$_singleton === false ) {
        static::$_singleton = new static();
    }