I often switch between .NET and PHP development. With ASP.NET sites I save configuration information (e.g. connection strings, directories, application setting) in the web.config file which is appropriately protected and easy to access the values, etc.
In PHP, I solve this with a class that has static methods for each variable:
class webconfig { public static function defaultPageIdCode() { return 'welcome'; } }
The file is included by the app variables are accessed with a one-line:
$dp = webconfig::defaultPageIdCode();
And since PHP isn't compiled, it is easy to telnet in and change a value for a website anyway, so this solution works fairly well and gives me these two advantages:
But I can imagine there are other ways people solve saving web config settings in PHP which may have other advantages.
Especially those who have experience with a number of PHP frameworks, what are other ways of saving config variables and their advantages and disadvantages?
The configuration variables are stored in the Moodle database, in the "config" table. They are loaded from there into the $CFG variable when one of the Moodle scripts starts up. If you want to have a look at $CFG, you could create a script file called "show-cfg.
I usually place database settings on config. php and all the dynamic settings on a database. All settings that don't change much are usually good to be placed to config file.
I've decided to list all known methods along with their advantages and disadvantages.
I've marked this answer as a community wiki so collaboration is easier.
define('CONFIG_DIRECTIVE', 'value');
$object = new MyObject(CONFIG_DIRECTIVE);
For example: XML, INI, YAML, etc.
config_directive = value
.) parse_ini_file()
.) $config['directive'] = 'value';
$object = new MyObject($config['directive']);
$container = new MyContainer($config);
myCfgObj::setDirective('DIRECTIVE', 'value');
myCfgObj->setDirective('DIRECTIVE', 'value');
$object = new MyObject(myCfgObj::getDirective('DIRECTIVE'));
$object = new MyObject(myCfgObj->getDirective('DIRECTIVE'));
I tend to use a Settings static class in PHP, this is because
Example:
abstract class Settings { static private $protected = array(); // For DB / passwords etc static private $public = array(); // For all public strings such as meta stuff for site public static function getProtected($key) { return isset(self::$protected[$key]) ? self::$protected[$key] : false; } public static function getPublic($key) { return isset(self::$public[$key]) ? self::$public[$key] : false; } public static function setProtected($key,$value) { self::$protected[$key] = $value; } public static function setPublic($key,$value) { self::$public[$key] = $value; } public function __get($key) {//$this->key // returns public->key return isset(self::$public[$key]) ? self::$public[$key] : false; } public function __isset($key) { return isset(self::$public[$key]); } }
Then within your runtime, if you loaded this file first, followed by your database config file, your database config file would look like so:
<?php Settings::setProtected('db_hostname', 'localhost'); Settings::setProtected('db_username', 'root'); Settings::setProtected('db_password', ''); Settings::setProtected('db_database', 'root'); Settings::setProtected('db_charset', 'UTF-8'); //... echo Settings::getProtected('db_hostname'); // localhost //... Settings::setPublic('config_site_title', 'MySiteTitle'); Settings::setPublic('config_site_charset', 'UTF-8'); Settings::setPublic('config_site_root', 'http://localhost/dev/');
As you can see the we have a method __get
that should only be allowed to grab public variables, An example of why we have this is as follows:
$template = new Template(); $template->assign('settings', new Settings());
Regardless the fact that we have used this object as a static object, the values should still stand so within the template you can now do, lets say.
<html> <head> <?php echo isset($settings->config_site_title) ? $settings->config_site_title : 'Fallback Title'; ?> </head> </html>
And this will only allow you to have access to the public data during the initialized period.
This can get a lot more complex but more system friendly, some examples:
loadConfig
method to automatically parse a config file, xml, php, yaml.shutdown_function
you can auto update the database with new settings.This too me is by far the best methods to complete this job.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With