Абстрактный синглтон

141
13 октября 2017, 16:38

Есть около тысячи объектов, по каждому из которых необходимо сделать по три запроса в БД, обработать результат и наполнить data class'ы.

Само собой напросилось решение с тремя синглтонами, хранящими подготовленные запросы и наследующими от одного абстрактного класса с общими методами.

Родитель:

abstract class RequestSingleton
{
    private static $instance;
    private        $stmt;
    /** @var  array */
    private        $params;
    private static $binded = false;
    abstract protected function getSql(): string;
    abstract protected function prepareParamsArray($params): array;
    abstract protected function parse(array $result);
    private function __construct() {
        $this->stmt = SMDBSS::getDb()->prepare($this->getSql());
    }
    private static function getInstance(): self {
        if (self::$instance === null) self::$instance = new static();
        return self::$instance;
    }
    public static function get($params) {
        $instance         = self::getInstance();
        $instance->params = $instance->prepareParamsArray($params);
        if (!self::$binded)
            $instance->bindParams();
        $instance->stmt->execute();
        return $instance->parse($instance->stmt->fetchAll());
    }
    private function bindParams() {
        foreach ($this->params as $key => $value) {
            $this->stmt->bindParam($key, $this->params[ $key ]);
        }
        self::$binded = true;
    }
}

Потомок:

class CiByIp extends RequestSingleton
{
    protected function getSql(): string {
        return 'SELECT LOGICAL_NAME AS ci FROM DEVICE2M1 WHERE IP_ADDRESS=:ip';
    }
    protected function prepareParamsArray($params): array {
        return ['ip' => $params];
    }
    protected function parse(array $result): string {
        return empty($result) ? '' : $result[0]['ci'];
    }
}

И вот что-то похоже я сам себя запутал. $instance то для них всех будет одним, тем, который первым создался.

Вопрос к знатокам - что делать!? В том смысле, что делать три отдельных класса с дублированием кучи кода не хочется и запросы подготавливать надо только один раз.

READ ALSO
На сайте пропал футер и часть header'а (OpenCart) [требует правки]

На сайте пропал футер и часть header'а (OpenCart) [требует правки]

С чем может быть связана проблема? На сайте пропала часть футера и весь хеадер, файлы перезаливал, не помогло

257
Вывод символа стоимости товара Virtuemart Joomla

Вывод символа стоимости товара Virtuemart Joomla

Использую Virtuemart на Joomla в качестве ознакомления с продукцией, без использования корзиныНужно выводить цены в двух валютах, но без дублирования,...

260
Выдает ошибку Trying to get property of non-object

Выдает ошибку Trying to get property of non-object

Делаю парсер цен и другой инфы с сайтаВот ссылка на всю эту инфу: https://loot

206