Est-il juste de définir une config classe PHP pour conserver les réglages du projet?
Je veux créer un config.php fichier pour garder les diverses valeurs de configuration généralement être modifiés à partir d'un projet à l'autre, et je veux définir une classe pour garder la config valeurs dans ce fichier comme suit:
class Config {
const DB_SERVER = 'localhost',
DB_NAME = 'abc',
DB_USERNAME = 'admin',
DB_PASSWORD = '12345',
WEBSITE_NAME = 'My New Website',
IMAGE_DIR = 'img';
}
et ainsi de suite, je veux définir toutes les valeurs des constantes à l'intérieur de la classe, et je vais les appeler comme les suivantes:
$connection = mysql_connect(Config::DB_SERVER, Config::DB_USERNAME, Config::DB_PASSWORD) or die("Database connection failed..");
Je veux savoir: Est-ce que cette manière de réglage de la configuration du projet est de droite? Cette façon ont des cons? Et si c'était mal, alors quelle est la meilleure façon de le faire?
Vous pouvez également utiliser
Oui, je sais, mais je ne veux pas utiliser le nom de constante seul, je veux utiliser n'importe quel mot avant d'indiquer que c'est une config de la valeur comme "Config" (nom de la classe) dans cet exemple
Dans ce cas,
Cela peut également vous être utile: stackoverflow.com/questions/1263954/...
define('CONFIG_DB_VAR', 'valeur'); Est une bonne idée et je vais la prendre en considération, Merci.
define('DB_VAR', 'value');
dans une sorte de fichier de configuration qui peuvent être inclus dans votre script.Oui, je sais, mais je ne veux pas utiliser le nom de constante seul, je veux utiliser n'importe quel mot avant d'indiquer que c'est une config de la valeur comme "Config" (nom de la classe) dans cet exemple
Dans ce cas,
define('CONFIG_DB_VAR', 'value');
Cela peut également vous être utile: stackoverflow.com/questions/1263954/...
define('CONFIG_DB_VAR', 'valeur'); Est une bonne idée et je vais la prendre en considération, Merci.
OriginalL'auteur Amr | 2012-06-11
Vous devez vous connecter pour publier un commentaire.
C'est une façon de le faire, oui. Un pas trop mauvais sens du terme, de l'OMI. Fondamentalement, la classe devient un fichier de config, juste avec la syntaxe PHP.
Il y a quelques inconvénients:
Vous ne pouvez pas avoir const
des tableaux ouobjets. (Bien sûr, vous ne pouvez pas constante globaleles tableaux/les objets, donc...) (Depuis 5.6, vous pouvez avoir constamment des tableaux. Toujours pas d'objets const. Je suis sûr que vous ne pouvez pas avoir const ressources soit, qui ne serait pas beaucoup de sens.)Vous pouvez contourner ce problème en mettant en œuvre une statique de lecture pour les objets (ce qui bien sûr est codé de manière à toujours revenir au même objet)...mais je le recommande contre elle dans la plupart des cas. C'est seulement une option sécuritaire si les objets dans votre config sont immuables, de par sa conception. (Les objets qui ne sont pas conçus pour l'immutabilité sont trop facile à changer, même par accident.)
(En dehors de la mutabilité problème, il m'énerve réelle de l'exécution de code dans un fichier de config...mais c'est principalement de préférence personnelle.)
Cette classe a un but différent que le reste-c'est prévu changer par projet. Vous pourriez envisager de garder la Config de classe quelque part à l'écart du reste de la classe, comme l'endroit où vous auriez normalement garder un fichier de config.
Avec un vrai fichier de configuration, puisque vous l'analyser au moment de l'exécution, vous pouvez éventuellement faire face à un fichier manquant ou incorrect (par exemple, en exécutant avec les paramètres par défaut, à l'aide de quelles parties sont analysables, et/ou en affichant un utile de message d'erreur). Mais une fois que votre configuration est en cours d'exécution comme du code PHP, les erreurs de syntaxe -- ou, si vous n'avez pas compté pour elle, un manque de Config de la classe -- arrêtera l'application de morts dans son sillage. Et si vous êtes en cours d'exécution avec
display_errors
off (recommandé dans la production), le problème est peut-être moins évident.Un autre inconvénient est la testabilité. Toute partie statique du code est difficile (voire impossible) de se moquer correctement lors de tests unitaires.
La testabilité n'est pas vraiment un inconvénient pour les config des constantes de classe par rapport à d'autres méthodes de configuration. Chargement automatique peut faire une config personnalisée classe facile...il suffit de charger votre remplacement avant que quelque chose a besoin d'elle, et il ya go. Le problème est que la configuration se complique unité de test, car elle requiert de l'inter-unité des relations. Fondamentalement, tous les schémas de configuration ont ce même problème lorsque mal utilisés. Si la testabilité est un objectif, alors votre application du code d'initialisation (et rien d'autre) devrait lire les paramètres de configuration et de colis pour tout le reste comme les paramètres du constructeur etc.
Si monkey patching est un moyen, alors oui, statique dépendances ne sont pas une grosse affaire. Je préfère la configuration dynamique des objets qui peuvent être moqué sans bricoler avec l'autochargeur.
OriginalL'auteur cHao
J'ai trouvé ces 2 articles qui parlent du même sujet et je trouve qu'ils sont très utiles et je voulais donc partager ici:
1- À l'aide de classes PHP pour stocker des données de configuration
2- À l'aide d'une Classe PHP pour Stocker la Configuration
J'espère qu'ils aident comme ils l'ont fait pour moi.
OriginalL'auteur Amr
Je pense, ce que vous voulez, c'est le statique-mot-clé!
comme ça. Vous cann avec
::
, par exempleConfig::$DB_SERVER
.Btw. normalement, vous n'avez pas les écrire gros comme ça si ils sont des variables de classe. De gros moyens globals, généralement.
en outre, la statique peut être changé... les constantes ne peuvent pas...
à droite, ils ont besoin d'un
$
. Je pensais vraiment que vous venez de confondre les deux mots clés. Si vraiment vous voulez juste de la constante de comportement c'est normal en PHP à ne pas le mettre dans une classe. Si vous voulez l'appeler sans en faire un objet de votre Config classe, alors vous aurez besoin de lastatic
, aussi, btw.Vous pouvez utiliser la finale, rite?
OriginalL'auteur erikbwork