我正在使用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) { } }
所以我只获得了第一个类实例,但我想要两者。
我该如何解决?
答案 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();
}