/** * Основной метод получения экземпляра. * * @param type $silentOnDoubleTry - признак, стоит ли нам ругаться, если мы * обнаруживаем зацикливание при попытке получения экземпляра класса. * * Это нужно для классов, которые выполняют сложную логику в конструкторе, которая * может привести к повторному вызову ::inst() внутри этого конструктора. * * Классы, которые используют эту возможность: * @link DbChangeListener - менеджер прослушивания изменений в БД */ protected static function inst($silentOnDoubleTry = false) { $class = get_called_class(); if (array_key_exists($class, self::$_insts_)) { return self::$_insts_[$class]; } if (array_key_exists($class, self::$_instsrq_)) { if ($silentOnDoubleTry) { return null; } raise_error("Double try to get singleton of [{$class}]"); } self::$_instsrq_[$class] = true; //Создаём экземпляр $sec = Secundomer::startedInst("Creating singleton of {$class}"); self::$_insts_[$class] = new $class(); $sec->stop(); //Экземпляр успешно создан unset(self::$_instsrq_[$class]); //Теперь добавим в профайлер. Всё это нужно для защиты от зацикливания. PsProfiler::inst(__CLASS__)->add($class, $sec); //Добавим к глобальному секундомеру - текущий $SECUNDOMER = self::$_secundomer_ ? self::$_secundomer_ : (self::$_secundomer_ = Secundomer::inst()); $SECUNDOMER->addSecundomer($sec); //Отлогируем PsLogger::inst(__CLASS__)->info("+ {$class} ({$sec->getAverage()} / {$SECUNDOMER->getTotalTimeRounded()})"); return self::$_insts_[$class]; }
/** @return ExternalProcess */ public static function inst() { return parent::inst(); }
/** @return AdminFoldedManager */ public static function inst() { AuthManager::checkAdminAccess(); return parent::inst(); }
/** @return FoldedStorage */ protected static function inst() { return parent::inst(); }
/** @return Memcache */ public static function inst() { return parent::inst()->MEMCACHE; }
/** @return Smarty */ public static function smarty() { return parent::inst()->smarty; }
/** @return CommentsNotifyManager */ public static function getInstance() { return parent::inst(); }
/** * Раз уж есдинственная задача данного класса - проверить изменения данных в БД, * то мы все действия можем выполнить в конструкторе, воспользовавшись тем * обстоятельством, что мы - синглтон. * * Важно! Получение экземпляра нужно вызывать с $silentOnDoubleTry=true, так как * при выполнении действий в конструкторе данного класса мы можем прийти к фолдингу, * который вызовет DbChangeListener::check(). */ public static function check() { parent::inst(true); }