/**
* Web Config object using Singleton pattern
*
* @author Rich Zygler, Jr.
* @datecreated 03/08/2005
* @access public
* @usage $config =& Config::getInstance();
* @usage $config->setConfig('admin_email', 'test@test.com');
* @usage $email = $config->getConfig('admin_email');
* @TODO
*/
class Config
{
var $configVars = array();
/*
* Create a new config object
*/
function &getInstance()
{
static $instance;
if (!$instance)
{
$instance = array(new Config);
}
return $instance[0];
}
/*
* Get config data
*
* @param $key string - array key of variable whose data we are retrieving
* @return $this->configVars string
*/
function getConfig($key)
{
return $this->configVars[$key];
}
/*
* Set config data
*
* @param $key string -variable to retrieve data stored
* @param $value string -variable that contains data to store
* @return true
* Can use arrays as well as in $config->setConfig('email_list', array(//... ));
* retrieve array by foreach($config->getConfig('email_list') as $email) { //... }
*
*/
function setConfig($key, $val)
{
$this->configVars[$key] = $val;
return true;
}
}
If you think the getInstance method looks a little borked, you're right. What we're doing there is attempting to return the first and only the first implementation of this object. So everytime you make a call to this config object, you should be getting the same one. That's why we return the [0]th item in the array. This is a little easier in PHP5 but for PHP4, this is what we're stuck with.
And here's how to use this bad boy:
/**
* config include
*
* @author Rich Zygler, Jr.
* @datecreated 03/08/2005
* @TODO
*/
// Bring in the Config class file
require_once ('Config.php');
// Instantiate our config object
// Remember in PHP4, we use the =&
// to pass by reference
$config =& Config::getInstance();
// Set up some config vars
// will change per application
// The usage here is: setConfig(varName, varValue)
$config->setConfig('appVersion', '1.o');
$config->setConfig('appName','Tester');
$config->setConfig('debug', true);
// Maybe set the DB connection vars
$config->setConfig('dbconn', array(
'username' => 'bunsen',
'password' => '!honeydew%',
'host' => 'localhost',
'db' => 'test',
'type' => 'mysql'
)
);
// Now to get those values back from the $config object
// first let's initialize our vars
$appVersion = '';
$appName = '';
$debug = false;
$dbConnArray = array(); // used for getting back db values
$dbUser = '';
$dbPass = '';
$dbHost = '';
$dbType = '';
$dbName = '';
// Now let's get the values from the config object and populate our variables
// of course, for a fully functioning app, you may want to check that these values are set
$appVersion = $config->getConfig('appVersion');
$appName = $config->getConfig('appName');
$debug = $config->getConfig('debug');
// Here, we slurp the whole array from the config into a new array
$dbConnArray = $config->getConfig('dbconn');
$dbUser = $dbConnArray['username'];
$dbPass = $dbConnArray['password'];
$dbHost = $dbConnArray['host'];
$dbType = $dbConnArray['type'];
$dbName = $dbConnArray['db'];
// Now let's echo everything out to make sure the values are
// coming back correctly
echo "The version is: $appVersion";
echo "The name is: $appName";
echo "The debugger is on: $debug (1 = true) ";
echo "The db username is: $dbUser ";
echo "The db password is: $dbPass ";
What's great about this method of doing things is that you virtually eliminate the need for global variables in functions and objects. This is a very good thing. If you need some configuration variables available to a function or object, you can pass it this config object like this:
// call the function this way
doSomethingWithConfig($config);
// define the function this way
// Remember to accept the object by reference (add the &)
// otherwise a copy of the config data is created -- not good
function doSomethingWithConfig(&$config)
{
// get app version
$appVersion = '';
$appVersion = $config->getConfig('appVersion');
return $appVersion;
}
If you like this way of doing things, wait until you try to recreate this in PHP5, it's even easier.
No comments:
Post a Comment