[task/acm-refactor] Refactor the ACM classes to have a common interface.

They are now refered to as cache drivers rather than ACM classes. The
additional utility functions from the original cache class have been
moved to the cache_service. The class loader is now instantiated without
a cache instance and passed one as soon as it is constructed to allow
autoloading the cache classes.

PHPBB3-9983
This commit is contained in:
Igor Wiedler 2010-11-03 18:35:31 +01:00
parent 36e95f939d
commit 9329b16ab1
23 changed files with 415 additions and 102 deletions

View file

@ -187,8 +187,6 @@ if (!empty($load_extensions) && function_exists('dl'))
// Include files
require($phpbb_root_path . 'includes/class_loader.' . $phpEx);
require($phpbb_root_path . 'includes/acm/acm_' . $acm_type . '.' . $phpEx);
require($phpbb_root_path . 'includes/cache.' . $phpEx);
require($phpbb_root_path . 'includes/template.' . $phpEx);
require($phpbb_root_path . 'includes/session.' . $phpEx);
require($phpbb_root_path . 'includes/auth.' . $phpEx);
@ -203,13 +201,15 @@ require($phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx);
// Set PHP error handler to ours
set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler');
// Cache must be loaded before class loader
$cache = new cache();
// Setup class loader first
$class_loader = new phpbb_class_loader($phpbb_root_path, '.' . $phpEx, $cache);
$class_loader = new phpbb_class_loader($phpbb_root_path, '.' . $phpEx);
$class_loader->register();
// set up caching
$acm = phpbb_cache_factory::create($acm_type)->get_acm();
$class_loader->set_acm($acm);
$cache = new phpbb_cache_service($acm);
// Instantiate some basic classes
$request = new phpbb_request();
$user = new user();

View file

@ -203,7 +203,7 @@ class ...
<ul>
<li><strong>phpBB3</strong><br />Core files and all files not assigned to a separate package</li>
<li><strong>acm</strong><br /><code>/includes/acm</code>, <code>/includes/cache.php</code><br />Cache System</li>
<li><strong>acm</strong><br /><code>/includes/cache</code>, <code>/includes/cache.php</code><br />Cache System</li>
<li><strong>acp</strong><br /><code>/adm</code>, <code>/includes/acp</code>, <code>/includes/functions_admin.php</code><br />Administration Control Panel</li>
<li><strong>dbal</strong><br /><code>/includes/db</code><br />Database Abstraction Layer.<br />Base class is <code>dbal</code>
<ul>

View file

@ -44,15 +44,21 @@ if (isset($_GET['avatar']))
exit;
}
require($phpbb_root_path . 'includes/acm/acm_' . $acm_type . '.' . $phpEx);
require($phpbb_root_path . 'includes/cache.' . $phpEx);
require($phpbb_root_path . 'includes/class_loader.' . $phpEx);
require($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx);
require($phpbb_root_path . 'includes/constants.' . $phpEx);
require($phpbb_root_path . 'includes/functions.' . $phpEx);
require($phpbb_root_path . 'includes/functions_download' . '.' . $phpEx);
$class_loader = new phpbb_class_loader($phpbb_root_path, '.' . $phpEx);
$class_loader->register();
// set up caching
$acm = phpbb_cache_factory::create($acm_type)->get_acm();
$class_loader->set_acm($acm);
$cache = new phpbb_cache_service($acm);
$db = new $sql_db();
$cache = new cache();
// Connect to DB
if (!@$db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, false))

View file

@ -16,17 +16,11 @@ if (!defined('IN_PHPBB'))
exit;
}
// Include the abstract base
if (!class_exists('acm_memory'))
{
require("{$phpbb_root_path}includes/acm/acm_memory.$phpEx");
}
/**
* ACM for APC
* @package acm
*/
class acm extends acm_memory
class phpbb_cache_driver_apc extends phpbb_cache_driver_memory
{
var $extension = 'apc';

24
phpBB/includes/cache/driver/base.php vendored Normal file
View file

@ -0,0 +1,24 @@
<?php
/**
*
* @package acm
* @version $Id$
* @copyright (c) 2010 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* @package acm
*/
abstract class phpbb_cache_driver_base implements phpbb_cache_driver_interface
{
}

View file

@ -16,18 +16,12 @@ if (!defined('IN_PHPBB'))
exit;
}
// Include the abstract base
if (!class_exists('acm_memory'))
{
require("{$phpbb_root_path}includes/acm/acm_memory.$phpEx");
}
/**
* ACM for eAccelerator
* @package acm
* @todo Missing locks from destroy() talk with David
*/
class acm extends acm_memory
class phpbb_cache_driver_eaccelerator extends phpbb_cache_driver_memory
{
var $extension = 'eaccelerator';
var $function = 'eaccelerator_get';

View file

@ -20,7 +20,7 @@ if (!defined('IN_PHPBB'))
* ACM File Based Caching
* @package acm
*/
class acm
class phpbb_cache_driver_file extends phpbb_cache_driver_base
{
var $vars = array();
var $var_expires = array();
@ -33,10 +33,10 @@ class acm
/**
* Set cache path
*/
function acm()
function __construct($cache_dir = null)
{
global $phpbb_root_path;
$this->cache_dir = $phpbb_root_path . 'cache/';
$this->cache_dir = !is_null($cache_dir) ? $cache_dir : $phpbb_root_path . 'cache/';
}
/**

View file

@ -0,0 +1,104 @@
<?php
/**
*
* @package acm
* @copyright (c) 2010 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* An interface that all cache drivers must implement
*
* @package acm
*/
interface phpbb_cache_driver_interface
{
/**
* Load global cache
*/
public function load();
/**
* Unload cache object
*/
public function unload();
/**
* Save modified objects
*/
public function save();
/**
* Tidy cache
*/
public function tidy();
/**
* Get saved cache object
*/
public function get($var_name);
/**
* Put data into cache
*/
public function put($var_name, $var, $ttl = 0);
/**
* Purge cache data
*/
public function purge();
/**
* Destroy cache data
*/
public function destroy($var_name, $table = '');
/**
* Check if a given cache entry exist
*/
public function _exists($var_name);
/**
* Load cached sql query
*/
public function sql_load($query);
/**
* Save sql query
*/
public function sql_save($query, &$query_result, $ttl);
/**
* Ceck if a given sql query exist in cache
*/
public function sql_exists($query_id);
/**
* Fetch row from cache (database)
*/
public function sql_fetchrow($query_id);
/**
* Fetch a field from the current row of a cached database result (database)
*/
public function sql_fetchfield($query_id, $field);
/**
* Seek a specific row in an a cached database result (database)
*/
public function sql_rowseek($rownum, $query_id);
/**
* Free memory used for a cached database result (database)
*/
public function sql_freeresult($query_id);
}

View file

@ -16,12 +16,6 @@ if (!defined('IN_PHPBB'))
exit;
}
// Include the abstract base
if (!class_exists('acm_memory'))
{
require("{$phpbb_root_path}includes/acm/acm_memory.$phpEx");
}
if (!defined('PHPBB_ACM_MEMCACHE_PORT'))
{
define('PHPBB_ACM_MEMCACHE_PORT', 11211);
@ -47,17 +41,17 @@ if (!defined('PHPBB_ACM_MEMCACHE'))
* ACM for Memcached
* @package acm
*/
class acm extends acm_memory
class phpbb_cache_driver_memcache extends phpbb_cache_driver_memory
{
var $extension = 'memcache';
var $memcache;
var $flags = 0;
function acm()
function __construct()
{
// Call the parent constructor
parent::acm_memory();
parent::__construct();
$this->memcache = new Memcache;
foreach(explode(',', PHPBB_ACM_MEMCACHE) as $u)

View file

@ -20,7 +20,7 @@ if (!defined('IN_PHPBB'))
* ACM Abstract Memory Class
* @package acm
*/
class acm_memory
class phpbb_cache_driver_memory extends phpbb_cache_driver_base
{
var $key_prefix;
@ -34,7 +34,7 @@ class acm_memory
/**
* Set cache path
*/
function acm_memory()
function __construct()
{
global $phpbb_root_path, $dbname, $table_prefix;

View file

@ -20,12 +20,12 @@ if (!defined('IN_PHPBB'))
* ACM Null Caching
* @package acm
*/
class acm
class phpbb_cache_driver_null extends phpbb_cache_driver_base
{
/**
* Set cache path
*/
function acm()
function __construct()
{
}

View file

@ -16,12 +16,6 @@ if (!defined('IN_PHPBB'))
exit;
}
// Include the abstract base
if (!class_exists('acm_memory'))
{
require("{$phpbb_root_path}includes/acm/acm_memory.$phpEx");
}
/**
* ACM for XCache
* @package acm
@ -31,13 +25,13 @@ if (!class_exists('acm_memory'))
* - xcache.admin.enable_auth = off (or xcache.admin.user and xcache.admin.password set)
*
*/
class acm extends acm_memory
class phpbb_cache_driver_xcache extends phpbb_cache_driver_memory
{
var $extension = 'XCache';
function acm()
function __construct()
{
parent::acm_memory();
parent::__construct();
if (!function_exists('ini_get') || (int) ini_get('xcache.var_size') <= 0)
{
@ -111,7 +105,7 @@ class acm extends acm_memory
* @access protected
* @param string $var Cache key
* @return bool True if it exists, otherwise false
*/
*/
function _isset($var)
{
return xcache_isset($this->key_prefix . $var);

52
phpBB/includes/cache/factory.php vendored Normal file
View file

@ -0,0 +1,52 @@
<?php
/**
*
* @package acm
* @version $Id$
* @copyright (c) 2010 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* @package acm
*/
class phpbb_cache_factory
{
private $acm_type;
public function __construct($acm_type)
{
$this->acm_type = $acm_type;
}
public function get_acm()
{
$class_name = 'phpbb_cache_driver_' . $this->acm_type;
return new $class_name();
}
public function get_service()
{
$acm = $this->get_acm();
$service = new phpbb_cache_service($acm);
return $service;
}
/**
* for convenience to allow:
* $cache = phpbb_cache_factory::create('file')->get_service();
*/
public static function create($acm_type)
{
return new self($acm_type);
}
}

View file

@ -17,11 +17,28 @@ if (!defined('IN_PHPBB'))
}
/**
* Class for grabbing/handling cached entries, extends acm_file or acm_db depending on the setup
* Class for grabbing/handling cached entries
* @package acm
*/
class cache extends acm
class phpbb_cache_service
{
private $acm;
public function __construct(phpbb_cache_driver_interface $acm = null)
{
$this->set_acm($acm);
}
public function set_acm(phpbb_cache_driver_interface $acm)
{
$this->acm = $acm;
}
public function __call($method, $arguments)
{
return call_user_func_array(array($this->acm, $method), $arguments);
}
/**
* Get config values
*/
@ -29,7 +46,7 @@ class cache extends acm
{
global $db;
if (($config = $this->get('config')) !== false)
if (($config = $this->acm->get('config')) !== false)
{
$sql = 'SELECT config_name, config_value
FROM ' . CONFIG_TABLE . '
@ -61,7 +78,7 @@ class cache extends acm
}
$db->sql_freeresult($result);
$this->put('config', $cached_config);
$this->acm->put('config', $cached_config);
}
return $config;
@ -75,7 +92,7 @@ class cache extends acm
{
global $db;
if (($censors = $this->get('_word_censors')) === false)
if (($censors = $this->acm->get('_word_censors')) === false)
{
$sql = 'SELECT word, replacement
FROM ' . WORDS_TABLE;
@ -89,7 +106,7 @@ class cache extends acm
}
$db->sql_freeresult($result);
$this->put('_word_censors', $censors);
$this->acm->put('_word_censors', $censors);
}
return $censors;
@ -100,7 +117,7 @@ class cache extends acm
*/
function obtain_icons()
{
if (($icons = $this->get('_icons')) === false)
if (($icons = $this->acm->get('_icons')) === false)
{
global $db;
@ -120,7 +137,7 @@ class cache extends acm
}
$db->sql_freeresult($result);
$this->put('_icons', $icons);
$this->acm->put('_icons', $icons);
}
return $icons;
@ -131,7 +148,7 @@ class cache extends acm
*/
function obtain_ranks()
{
if (($ranks = $this->get('_ranks')) === false)
if (($ranks = $this->acm->get('_ranks')) === false)
{
global $db;
@ -161,7 +178,7 @@ class cache extends acm
}
$db->sql_freeresult($result);
$this->put('_ranks', $ranks);
$this->acm->put('_ranks', $ranks);
}
return $ranks;
@ -176,7 +193,7 @@ class cache extends acm
*/
function obtain_attach_extensions($forum_id)
{
if (($extensions = $this->get('_extensions')) === false)
if (($extensions = $this->acm->get('_extensions')) === false)
{
global $db;
@ -220,7 +237,7 @@ class cache extends acm
}
$db->sql_freeresult($result);
$this->put('_extensions', $extensions);
$this->acm->put('_extensions', $extensions);
}
// Forum post
@ -281,7 +298,7 @@ class cache extends acm
*/
function obtain_bots()
{
if (($bots = $this->get('_bots')) === false)
if (($bots = $this->acm->get('_bots')) === false)
{
global $db;
@ -320,7 +337,7 @@ class cache extends acm
}
$db->sql_freeresult($result);
$this->put('_bots', $bots);
$this->acm->put('_bots', $bots);
}
return $bots;
@ -341,7 +358,7 @@ class cache extends acm
foreach ($parsed_items as $key => $parsed_array)
{
$parsed_array = $this->get('_cfg_' . $key . '_' . $theme[$key . '_path']);
$parsed_array = $this->acm->get('_cfg_' . $key . '_' . $theme[$key . '_path']);
if ($parsed_array === false)
{
@ -367,7 +384,7 @@ class cache extends acm
$parsed_array = parse_cfg_file($filename);
$parsed_array['filetime'] = @filemtime($filename);
$this->put('_cfg_' . $key . '_' . $theme[$key . '_path'], $parsed_array);
$this->acm->put('_cfg_' . $key . '_' . $theme[$key . '_path'], $parsed_array);
}
$parsed_items[$key] = $parsed_array;
}
@ -380,7 +397,7 @@ class cache extends acm
*/
function obtain_disallowed_usernames()
{
if (($usernames = $this->get('_disallowed_usernames')) === false)
if (($usernames = $this->acm->get('_disallowed_usernames')) === false)
{
global $db;
@ -395,7 +412,7 @@ class cache extends acm
}
$db->sql_freeresult($result);
$this->put('_disallowed_usernames', $usernames);
$this->acm->put('_disallowed_usernames', $usernames);
}
return $usernames;
@ -408,7 +425,7 @@ class cache extends acm
{
global $phpbb_root_path, $phpEx;
if (($hook_files = $this->get('_hooks')) === false)
if (($hook_files = $this->acm->get('_hooks')) === false)
{
$hook_files = array();
@ -427,7 +444,7 @@ class cache extends acm
closedir($dh);
}
$this->put('_hooks', $hook_files);
$this->acm->put('_hooks', $hook_files);
}
return $hook_files;

View file

@ -33,7 +33,7 @@ class phpbb_class_loader
{
private $phpbb_root_path;
private $php_ext;
private $cache;
private $acm;
private $cached_paths = array();
/**
@ -42,13 +42,14 @@ class phpbb_class_loader
*
* @param string $phpbb_root_path phpBB's root directory containing includes/
* @param string $php_ext The file extension for PHP files
* @param phpbb_acm_interface $acm An implementation of the phpBB cache interface.
*/
public function __construct($phpbb_root_path, $php_ext = '.php', $cache = null)
public function __construct($phpbb_root_path, $php_ext = '.php', phpbb_cache_driver_interface $acm = null)
{
$this->phpbb_root_path = $phpbb_root_path;
$this->php_ext = $php_ext;
$this->set_cache($cache);
$this->set_acm($acm);
}
/**
@ -56,13 +57,13 @@ class phpbb_class_loader
* the class loader will resolve paths by checking for the existance of every
* directory in the class name every time.
*
* @param acm $cache An implementation of the phpBB cache interface.
* @param phpbb_acm_interface $acm An implementation of the phpBB cache interface.
*/
public function set_cache($cache = null)
public function set_acm(phpbb_cache_driver_interface $acm = null)
{
if ($cache)
if ($acm)
{
$this->cached_paths = $cache->get('class_loader');
$this->cached_paths = $acm->get('class_loader');
if ($this->cached_paths === false)
{
@ -70,7 +71,7 @@ class phpbb_class_loader
}
}
$this->cache = $cache;
$this->acm = $acm;
}
/**
@ -133,10 +134,10 @@ class phpbb_class_loader
return false;
}
if ($this->cache)
if ($this->acm)
{
$this->cached_paths[$class] = $relative_path;
$this->cache->put('class_loader', $this->cached_paths);
$this->acm->put('class_loader', $this->cached_paths);
}
return $path_prefix . $relative_path . $this->php_ext;

View file

@ -61,8 +61,6 @@ if (!empty($load_extensions) && function_exists('dl'))
// Include files
require($phpbb_root_path . 'includes/class_loader.' . $phpEx);
require($phpbb_root_path . 'includes/acm/acm_' . $acm_type . '.' . $phpEx);
require($phpbb_root_path . 'includes/cache.' . $phpEx);
require($phpbb_root_path . 'includes/template.' . $phpEx);
require($phpbb_root_path . 'includes/session.' . $phpEx);
require($phpbb_root_path . 'includes/auth.' . $phpEx);
@ -93,11 +91,14 @@ else
define('STRIP', (get_magic_quotes_gpc()) ? true : false);
}
$cache = new cache();
$class_loader = new phpbb_class_loader($phpbb_root_path, '.' . $phpEx, $cache);
$class_loader = new phpbb_class_loader($phpbb_root_path, '.' . $phpEx);
$class_loader->register();
// set up caching
$acm = phpbb_cache_factory::create($acm_type)->get_acm();
$class_loader->set_acm($acm);
$cache = new phpbb_cache_service($acm);
$request = new phpbb_request();
$user = new user();
$db = new $sql_db();

View file

@ -163,8 +163,6 @@ if (file_exists($phpbb_root_path . 'includes/functions_content.' . $phpEx))
include($phpbb_root_path . 'includes/auth.' . $phpEx);
include($phpbb_root_path . 'includes/session.' . $phpEx);
include($phpbb_root_path . 'includes/template.' . $phpEx);
include($phpbb_root_path . 'includes/acm/acm_file.' . $phpEx);
include($phpbb_root_path . 'includes/cache.' . $phpEx);
include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
include($phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx);
require($phpbb_root_path . 'includes/functions_install.' . $phpEx);
@ -172,6 +170,11 @@ require($phpbb_root_path . 'includes/functions_install.' . $phpEx);
$class_loader = new phpbb_class_loader($phpbb_root_path, '.' . $phpEx);
$class_loader->register();
// set up caching
$acm = phpbb_cache_factory::create($acm_type)->get_acm();
$class_loader->set_acm($acm);
$cache = new phpbb_cache_service($acm);
$request = new phpbb_request();
// make sure request_var uses this request instance

View file

@ -57,18 +57,19 @@ if ($id)
{
// Include files
require($phpbb_root_path . 'includes/class_loader.' . $phpEx);
require($phpbb_root_path . 'includes/acm/acm_' . $acm_type . '.' . $phpEx);
require($phpbb_root_path . 'includes/cache.' . $phpEx);
require($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx);
require($phpbb_root_path . 'includes/constants.' . $phpEx);
require($phpbb_root_path . 'includes/functions.' . $phpEx);
$cache = new cache();
$class_loader = new phpbb_class_loader($phpbb_root_path, '.' . $phpEx, $cache);
$class_loader = new phpbb_class_loader($phpbb_root_path, '.' . $phpEx);
$class_loader->register();
$request = new phpbb_request();
// set up caching
$acm = phpbb_cache_factory::create($acm_type)->get_acm();
$class_loader->set_acm($acm);
$cache = new phpbb_cache_service($acm);
$request = new phpbb_request();
$db = new $sql_db();
// make sure request_var uses this request instance
@ -308,5 +309,3 @@ if ($id)
}
$db->sql_close();
}
exit;

View file

@ -28,7 +28,7 @@ else
require_once $phpbb_root_path . 'includes/constants.php';
require_once $phpbb_root_path . 'includes/class_loader.' . $phpEx;
$class_loader = new phpbb_class_loader($phpbb_root_path, '.' . $phpEx);
$class_loader = new phpbb_class_loader($phpbb_root_path, '.php');
$class_loader->register();
require_once 'test_framework/phpbb_test_case_helpers.php';

40
tests/cache/all_tests.php vendored Normal file
View file

@ -0,0 +1,40 @@
<?php
/**
*
* @package testing
* @copyright (c) 2010 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
if (!defined('PHPUnit_MAIN_METHOD'))
{
define('PHPUnit_MAIN_METHOD', 'phpbb_request_all_tests::main');
}
require_once 'test_framework/framework.php';
require_once 'PHPUnit/TextUI/TestRunner.php';
require_once 'cache/cache_test.php';
class phpbb_cache_all_tests
{
public static function main()
{
PHPUnit_TextUI_TestRunner::run(self::suite());
}
public static function suite()
{
$suite = new PHPUnit_Framework_TestSuite('phpBB Cache System');
$suite->addTestSuite('phpbb_cache_test');
return $suite;
}
}
if (PHPUnit_MAIN_METHOD == 'phpbb_cache_all_tests::main')
{
phpbb_cache_all_tests::main();
}

39
tests/cache/cache_test.php vendored Normal file
View file

@ -0,0 +1,39 @@
<?php
/**
*
* @package testing
* @version $Id$
* @copyright (c) 2010 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
require_once 'test_framework/framework.php';
class phpbb_cache_test extends phpbb_test_case
{
protected function tearDown()
{
$iterator = new DirectoryIterator('cache/tmp');
foreach ($iterator as $file)
{
if (is_file('cache/tmp/' . $file))
{
unlink('cache/tmp/' . $file);
}
}
}
public function test_acm_file()
{
$acm = new phpbb_cache_driver_file('cache/tmp/');
$acm->put('test_key', 'test_value');
$acm->save();
$this->assertEquals(
'test_value',
$acm->get('test_key'),
'File ACM put and get'
);
}
}

View file

@ -8,7 +8,9 @@
*
*/
class phpbb_cache_mock
require '../phpBB/includes/cache/driver/interface.php';
class phpbb_cache_mock implements phpbb_cache_driver_interface
{
private $variables = array();
@ -22,8 +24,51 @@ class phpbb_cache_mock
return false;
}
function put($var_name, $value)
function put($var_name, $value, $ttl = 0)
{
$this->variables[$var_name] = $value;
}
function load()
{
}
function unload()
{
}
function save()
{
}
function tidy()
{
}
function purge()
{
}
function destroy($var_name, $table = '')
{
}
public function _exists($var_name)
{
}
public function sql_load($query)
{
}
public function sql_save($query, &$query_result, $ttl)
{
}
public function sql_exists($query_id)
{
}
public function sql_fetchrow($query_id)
{
}
public function sql_fetchfield($query_id, $field)
{
}
public function sql_rowseek($rownum, $query_id)
{
}
public function sql_freeresult($query_id)
{
}
}

View file

@ -10,8 +10,6 @@
require_once __DIR__ . '/cache_mock.php';
require_once __DIR__ . '/../../phpBB/includes/class_loader.php';
class phpbb_class_loader_test extends PHPUnit_Framework_TestCase
{
public function setUp()
@ -63,8 +61,16 @@ class phpbb_class_loader_test extends PHPUnit_Framework_TestCase
public function test_resolve_cached()
{
$cache = new phpbb_cache_mock;
$cache->put('class_loader', array('phpbb_a_cached_name' => 'a/cached_name'));
$cacheMap = array('class_loader' => array('phpbb_a_cached_name' => 'a/cached_name'));
$cache = $this->getMock('phpbb_cache_driver_interface',
array('get', 'put', 'load', 'unload', 'save', 'tidy', 'purge', 'destroy', '_exists',
'sql_load', 'sql_save', 'sql_exists', 'sql_fetchrow', 'sql_fetchfield', 'sql_rowseek', 'sql_freeresult'));
$cache->expects($this->any())
->method('get')
->will($this->returnCallback(function($var_name) use ($cacheMap) {
return $cacheMap[$var_name];
}));
$prefix = __DIR__ . '/';
$class_loader = new phpbb_class_loader($prefix, '.php', $cache);