В приложении, над которым я работаю, часть Model стека MVC предназначена для работы через одиночные игры; каждая модель имеет __getInstanceMethod, равный
protected static $singleton;
public static function __getInstance(): self {
if(self::$singleton === null) {
self::$singleton = __CLASS__;
self::$singleton = new self::$singleton;
}
return self::$singleton;
}
Конечным результатом является то, что если __getInstance () вызывается дважды для одного и того же класса модели, он возвращает один и тот же точный объект оба раза.
Я пытался чтобы уменьшить дублирование кода путем перемещения метода __getInstance () в родительский класс модели BaseModel, отредактировав его следующим образом.
class BaseModel {
protected static $singleton;
public static function __getInstance(): self {
if (static::$singleton === null) {
static::$singleton = static::class;
static::$singleton = new static::$singleton();
}
return static::$singleton;
}
}
class AModel extends BaseModel {
protected static $singleton;
/** ... */
}
class BModel extends BaseModel {
protected static $singleton;
/** ... */
}
AModel::__getInstance(); // AModel
BModel::__getInstance(); // BModel
Проблема в том, что мне нужно вручную добавить свойство $ singleton для каждого элемента Класс Model, в противном случае мне всегда будет возвращен экземпляр первого класса Model, для которого я вызвал метод.
class BaseModel {
protected static $singleton;
public static function __getInstance(): self {
if (static::$singleton === null) {
static::$singleton = static::$class;
static::$singleton = new static::$singleton();
}
return static::$singleton;
}
}
class AModel extends BaseModel {}
class BModel extends BaseModel {}
AModel::__getInstance(); // AModel
BModel::__getInstance(); // Still AModel
Есть ли способ избежать этого?