129 votes

Création d'un fichier de configuration en PHP

Je veux créer un fichier de configuration pour mon projet PHP, mais je ne suis pas sûr de la meilleure façon de le faire.

J'ai trois idées pour l'instant.

Variable à usage unique

$config['hostname'] = "localhost";
$config['dbuser'] = "dbuser";
$config['dbpassword'] = "dbpassword";
$config['dbname'] = "dbname";
$config['sitetitle'] = "sitetitle";

2-Use Const

define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost');
define('TITLE', 'sitetitle');

Base de données à 3 usages

J'utiliserai la configuration dans les classes et je ne suis pas sûr de la meilleure façon de procéder ou de l'existence d'une meilleure méthode.

4voto

Vous pouvez créer une classe de configuration avec des propriétés statiques.

class Config 
{
    static $dbHost = 'localhost';
    static $dbUsername = 'user';
    static $dbPassword  = 'pass';
}

alors vous pouvez l'utiliser simplement :

Config::$dbHost  

Dans mes projets, j'utilise parfois un modèle de conception SINGLETON pour accéder aux données de configuration. C'est très confortable à utiliser.

Pourquoi ?

Par exemple, vous avez 2 sources de données dans votre projet. Et vous pouvez choisir laquelle d'entre elles est activée.

  • mysql
  • json

Quelque part dans le fichier de configuration que vous choisissez :

$dataSource = 'mysql' // or 'json'

Lorsque vous changez de source, toute l'application doit passer à la nouvelle source de données, ce qui fonctionne bien et ne nécessite pas de modification du code.

Exemple :

Config :

class Config 
{
  // ....
  static $dataSource = 'mysql';
  / .....
}

Classe singleton :

class AppConfig
{
    private static $instance;
    private $dataSource;

    private function __construct()
    {
        $this->init();
    }

    private function init()
    {
        switch (Config::$dataSource)
        {
            case 'mysql':
                $this->dataSource = new StorageMysql();
                break;
            case 'json':
                $this->dataSource = new StorageJson();
                break;
            default:
                $this->dataSource = new StorageMysql();
        }
    }

    public static function getInstance()
    {
        if (empty(self::$instance)) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function getDataSource()
    {
        return $this->dataSource;
    }
}

... et quelque part dans votre code (par exemple, dans une classe de service) :

$container->getItemsLoader(AppConfig::getInstance()->getDataSource()) // getItemsLoader need Object of specific data source class by dependency injection

Nous pouvons obtenir un objet AppConfig de n'importe quel endroit du système et obtenir toujours la même copie (grâce à static). La méthode init () de la classe est appelée dans le constructeur, ce qui garantit une seule exécution. Vérifications du corps de la méthode init() La valeur de la config $dataSource, et crée un nouvel objet de la classe de source de données spécifique. Maintenant notre script peut obtenir l'objet et opérer sur lui, sans savoir même quelle implémentation spécifique existe réellement.

2voto

trigun0x2 Points 233

Si vous pensez utiliser plus d'un db pour une raison quelconque, optez pour la variable car vous pourrez modifier un paramètre pour passer à un db entièrement différent. Par exemple, pour les tests, les sauvegardes automatiques, etc.

2voto

phpalix Points 649

Define rendra la constante disponible partout dans votre classe sans avoir besoin d'utiliser global, alors que la variable nécessite d'être globale dans la classe, j'utiliserais DEFINE. Mais encore une fois, si les paramètres de la base de données doivent changer pendant l'exécution du programme, vous pourriez vouloir vous en tenir à variable.

1voto

Voici ma méthode.

    <?php

    define('DEBUG',0);

    define('PRODUCTION',1);

    #development_mode : DEBUG / PRODUCTION

    $development_mode = PRODUCTION;

    #Website root path for links

    $app_path = 'http://192.168.0.234/dealer/';

    #User interface files path

    $ui_path = 'ui/';

    #Image gallery path

    $gallery_path = 'ui/gallery/';

    $mysqlserver = "localhost";
    $mysqluser = "root";
    $mysqlpass = "";
    $mysqldb = "dealer_plus";

   ?>

En cas de doute, veuillez commenter

0voto

Ahmed Abdelhak Points 190

Que pensez-vous de quelque chose comme ça ?

class Configuration
{

    private $config;

    public function __construct($configIniFilePath)
    {
        $this->config = parse_ini_file($configIniFilePath, true);
    }

    /**
     * Gets the value for the specified setting name.
     *
     * @param string $name the setting name
     * @param string $section optional, the name of the section containing the
     *     setting
     * @return string|null the value of the setting, or null if it doesn't exist
     */
    public function getConfiguration($name, $section = null)
    {
        $configValue = null;

        if ($section === null) {
            if (array_key_exists($name, $this->config)) {
                $configValue = $this->config[$name];
            }
        } else {
            if (array_key_exists($section, $this->config)) {
                $sectionSettings = $this->config[$section];
                if (array_key_exists($name, $sectionSettings)) {
                    $configValue = $sectionSettings[$name];
                }
            }
        }

        return $configValue;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X