0

我正在一个与 PHP 中的 OOP 一起工作的项目中工作。

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

数据库.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) { } } 

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

我该如何解决?

4

2 回答 2

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);
于 2013-03-19T04:35:38.650 回答
0

试试这个:

protected static $_singleton = false;

public final static function connect () {
    if ( static::$_singleton === false ) {
        static::$_singleton = new static();
    }
于 2013-03-19T03:21:01.200 回答