Agylus a écrit :
Tu confonds constante dans le temps et constante dans un script. Une constante en programmation est inhérent à un script et non dans le temps. Donc quand tu fais un define, c'est forcément pour une constante liée au script (c'est logique), donc je ne vois pas en quoi mettre un time() dans une constante en début de script est sémantiquement incorrect, c'est au contraire tout ce qu'il y a de plus correct.
Un autre exemple tout con : Je gère trois ou quatre serveurs load-balancés, je veux faire un script de logs dont le nom du fichier va par exemple prendre le nom du serveur en question. Je vais donc créer une constante qui prendra pour valeur le nom du serveur puis l'extension et ça me donnera le nom du fichier en constante pour ce script.
On a donc :
define( 'NOM_DU_FICHIER', $_ENV['HOSTNAME'] . '.log' );
Et il n'y a rien de sémantiquement incorrect.
N'oublions pas que le but n'est pas d'avoir la qualité suprême pour qu'une application tourne correctement. Cependant, si une personne reprend le code, il peut y avoir des des ambiguïtés ou des difficultés pour ajouter des greffons.
Ton exemple est pertinent. Cependant, c'est une « exception » puisque ce sont des variables
prédéfinies et figées. Au même titre qu'un dsn de base de données (HOST, USER, BDD, PASSWORD).
La valeur d'un constante est une
valeur fixe sur lequel tu peux t'appuyer partout dans le code.
Dans ton exemple la valeur de ta constante est l'addition de deux strings. Donc, tu sors de la définition puisque cette constante est égale à ceci + cela (données prédéfinies + données « variables »).
define( 'NOM_DU_FICHIER', $_ENV['HOSTNAME']);
define('EXTENSION_FICHIER_JOURNAL','.log');
$journalServeur = NOM_DU_FICHIER.EXTENSION_FICHIER_JOURNAL;
J'avoue que peut être j'aurai écris comme toi, puisque c'est du texte en dure. (Je ne connaissais pas $_ENV['HOSTNAME']. merci
À propos de la
sémantique :
Wikipedia a écrit :
En particulier, la sémantique possède plusieurs objets d'étude :
* la signification des mots composés,
* les rapports de sens entre les mots (relations d'homonymie, de synonymie, d'antonymie, de polysémie, d'hyperonymie, d'hyponymie, etc.),
* la distribution des actants au sein d'un énoncé,
* les conditions de vérité d'un énoncé,
* l'analyse critique du discours,
* la pragmatique, en tant qu'elle est considérée comme une branche de la sémantique.
Le terme de sémantique est utilisé en opposition à celui de syntaxe dans l'étude des langages de programmation en informatique, pour laquelle elle a été développée de manière formelle (voir sémantique des langages de programmation). Il y a entre la sémantique et la syntaxe le même rapport qu'entre le fond et la forme.
[...]
Ormis les constantes magiques :
définition (qui à mon goût manque d'être explicite. Comment est obtenu la valeur d'une constante ?)
php.net a écrit :
Une constante est un identifiant (un nom) qui représente une valeur simple. Comme son nom le suggère, cette valeur ne peut jamais être modifiée durant l'exécution du script (sauf les constantes magiques). Par défaut, le nom d'une constante est sensible à la casse. Par convention, les constantes sont toujours en majuscules.
À propos de la syntaxe
php.net a écrit :
Vous pouvez définir une constante en utilisant la fonction define() ou en utilisant le mot-clé const en dehors d'une définition de classe à partir de PHP 5.3.0. Une fois qu'une constante est définie, elle ne peut jamais être modifiée, ou détruite.
Seuls les types de données scalaires peuvent être placés dans une constante : c'est à dire les types booléen, entier, double et chaîne de caractères (soit bool, entier, double et string. Il est possible de définir des constantes en tant que resource, mais cet usage est déconseillé, car il peut mener à des résultats inattendus.
source :
* constante (sommaire)
* constante (syntaxe)
Partant de ce raisonnement et de la définition d'une constante, une constante est donc une valeur écrite en dure (figée).
// syntaxiquement juste
// sémantiquement faut :
// <quote source="php.net">[...] Comme son nom le suggère, cette valeur ne peut jamais être modifiée durant l'exécution du script. [...]</quote>
// quel est le temps d'exécution du script ? zéro ? TIMESTAMP de l'utilisateur A aura la même valeur que TIMESTAMP de l'utilisateur B ?
//La lune est carrée
define ("TIMESTAMP",time());
Alors tu vas me dire :
Une constante est accessible partout. Si j'utilise des variables, il faut les globaliser. bonjour le code

:
function uneFonction(){
global $uneVar1 ;
global $uneVar2 ;
global $uneVar3 ;
global $uneVar4 ;
global $uneVar5 ;
//fermer pas la porte, il y en a encore
//traitement fonction
}
function uneAutre(){
global $uneVar4, $uneVar5, $uneVar6, $uneVar7,$uneVar8, $uneVar9;
//fermer pas la porte, il y en a encore
//traitement fonction
}
// etc.
En effet, le code.... Mmmmh, réfléchissons un instant... Et si on fait une pierre deux coups ! regrouper les types de données (catégories) et accessibles partout dans le code. Oui mais comment ? Sachant qu'une variable est potentiellement disponible partout dans le code :
fichier 1 :
define("REP_INCL","include/");
define("REP_CLASS","class/");
define("REP_MEDIA","media/");
$tabConfig = array(
"class" => REP_INCL.REP_CLASS,
"images" => REP_INCL.REP_MEDIA
);
fichier 2 :
require_once "file1.php";
function uneFonction(){
if(!empty($GLOBALS))
print_r($GLOBALS["tabConfig"]);
}
uneFonction();
À noter que le tableau $GLOBALS a toutes les données globales disponibles ($_ENV - $_SERVER - $_POST - etc.)
Modifié par Nolem (27 Oct 2009 - 21:47)