/**
  * Returns a cache instance.
  *
  * @param bool $apply_proxied_operations Whether or not to apply any
  *                                       proxied (disable this in tests!)
  * @return StudipCache the cache instance
  */
 public static function getCache($apply_proxied_operations = true)
 {
     if (is_null(self::$cache)) {
         $proxied = false;
         if (!$GLOBALS['CACHING_ENABLE']) {
             self::$cache = new StudipNullCache();
             // Proxy cache operations if CACHING_ENABLE is different from the globally set
             // caching value. This should only be the case in cli mode.
             if (isset($GLOBALS['GLOBAL_CACHING_ENABLE']) && $GLOBALS['GLOBAL_CACHING_ENABLE']) {
                 $proxied = true;
             }
         } else {
             try {
                 $class = self::loadCacheClass();
                 $args = self::retrieveConstructorArguments();
                 self::$cache = self::instantiateCache($class, $args);
             } catch (Exception $e) {
                 error_log(__METHOD__ . ': ' . $e->getMessage());
                 PageLayout::addBodyElements(MessageBox::error(__METHOD__ . ': ' . $e->getMessage()));
                 $class = self::DEFAULT_CACHE_CLASS;
                 self::$cache = new $class();
             }
         }
         // If proxy should be used, inject it. Otherwise apply pending
         // operations, if any.
         if ($proxied) {
             self::$cache = new StudipCacheProxy(self::$cache);
         } elseif ($GLOBALS['CACHING_ENABLE'] && $apply_proxied_operations) {
             // Even if the above condition will try to eliminate most
             // failures, the following operation still needs to be wrapped
             // in a try/catch block. Otherwise there are no means to
             // execute migration 166 which creates the neccessary tables
             // for said operation.
             try {
                 StudipCacheOperation::apply(self::$cache);
             } catch (Exception $e) {
             }
         }
     }
     return self::$cache;
 }