9
votes

Comment utiliser des constantes avec une syntaxe complexe (bouclée)?

J'ai été surpris de voir que ce qui suit ne fonctionne pas comme prévu. xxx

sorties: quelle est la valeur de {const_test} va être?

Existe-t-il un moyen de résoudre les constantes dans les bretelles bouclées?

Oui, je suis au courant que je pouvais juste faire xxx

mais je préférerais ne pas concataner cordes, pas tellement pour la performance mais pour la lisibilité.


3 commentaires

Si cela ne fonctionne pas, cela ne fonctionne pas. Résoudre en changeant la source PHP et en recompilant. :-)


Même moins lisible si {const_test} est à l'intérieur de la chaîne. Utiliser plutôt une concaténation.


STEREOFROG: Ouais, PHP est plein de fonctionnalités de hacker, de sympathie de syntaxe et d'écriture-what-you-you-thec-thing-the-thing-the-the-the-thing thing thing-the-the - vous serez surpris!


4 Réponses :


7
votes

Nope non possible car php considérera const_test code> être une simple chaîne string forte> à l'intérieur des citations simples / doubles. Vous devrez utiliser la concaténation forte> pour cela.

echo "What is the value of ".CONST_TEST." going to be?";


2 commentaires

Merci pour l'explication, je pensais que php résoudrait tout à l'intérieur des bretelles bouclées. Mais je vois que cela ne fonctionne que pour $ variables.


Ouais. Cela ne fonctionnera que pour quelque chose en commençant par un $. Par exemple. {classe :: static} ne fonctionne pas non plus :(



2
votes

Je ne comprends pas pourquoi vous devez faire une grosse histoire, mais vous pouvez toujours faire:

define('CONST_TEST','Some string');
$def=CONST_TEST;
echo "What is the value of $def going to be?";


2 commentaires

Je ne pensais pas que je faisais une grosse fouille, juste la curiosité :)


Dans mon cas, j'ai généré des fichiers avec toutes nos noms de la colonne de données et de la table en tant que constantes de classe. Je dois actuellement créer une variable distincte pour chaque constante dans chaque fonction que je l'utilise. C'est ce que je finis par faire, mais c'est très ennuyeux



2
votes

Cela peut ne pas être possible, mais étant donné que votre objectif est la lisibilité, vous pouvez utiliser Sprintf / Printf pour une meilleure lisibilité que la concaténation à la chaîne.

define('CONST_TEST','Some string');
printf("What is the value of %s going to be?", CONST_TEST);


1 commentaires

joli! n'a pas pensé à ça



1
votes

Si vous le souhaitez vraiment mal, vous pouvez écrire un petit code à l'aide de la réflexion qui trouve toutes les constantes et leurs valeurs. Ensuite, les définit à l'intérieur d'une variable comme $ Constantes ['Constant_Name'] ... CODE> Cela voudrait alors signifier si jamais vous souhaitez mettre une constante dans une chaîne que vous pouvez utiliser {}. Aussi, plutôt que de les ajouter à $ constantes code>, faites-en une classe qui implémente ArrayAccess afin que vous puissiez appliquer que les valeurs utilisées ne peuvent en aucun cas être modifiées (seuls les nouveaux éléments ajoutés à l'objet qui peut être accessible en tant que tableau).

Ainsi, il ressemblerait: P>

$CONSTANTS = new constant_collection();

//this bit would normally be automatically populate using reflection to find all the constants... but just for demo purposes, here is what would and wouldn't be allowed.
$CONSTANTS['PI'] = 3.14;
$CONSTANTS['PI'] = 4.34; //triggers an error
unset($CONSTANTS['PI']); //triggers an error
foreach ($CONSTANTS as $name=>$value) {
    .... only if the correct interface methods are implemented to allow this
}
print count($CONSTANTS); //only if the countable interface is implemented to allow this

print "PI is {$CONSTANTS['PI']}"; //works fine :D


0 commentaires