示例#1
0
 /**
  * Основной метод получения экземпляра.
  * 
  * @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];
 }
示例#2
0
 /** @return ExternalProcess */
 public static function inst()
 {
     return parent::inst();
 }
 /** @return AdminFoldedManager  */
 public static function inst()
 {
     AuthManager::checkAdminAccess();
     return parent::inst();
 }
示例#4
0
 /** @return FoldedStorage */
 protected static function inst()
 {
     return parent::inst();
 }
 /** @return Memcache */
 public static function inst()
 {
     return parent::inst()->MEMCACHE;
 }
示例#6
0
 /** @return Smarty */
 public static function smarty()
 {
     return parent::inst()->smarty;
 }
示例#7
0
 /** @return CommentsNotifyManager */
 public static function getInstance()
 {
     return parent::inst();
 }
示例#8
0
 /**
  * Раз уж есдинственная задача данного класса - проверить изменения данных в БД,
  * то мы все действия можем выполнить в конструкторе, воспользовавшись тем
  * обстоятельством, что мы - синглтон.
  * 
  * Важно! Получение экземпляра нужно вызывать с $silentOnDoubleTry=true, так как
  * при выполнении действий в конструкторе данного класса мы можем прийти к фолдингу,
  * который вызовет DbChangeListener::check().
  */
 public static function check()
 {
     parent::inst(true);
 }