2009-08-12 10 views
21

Comment puis-je obtenir PHP pour évaluer une variable statique entre guillemets?Variables statiques PHP entre guillemets

Je veux faire quelque chose comme ceci:

log("self::$CLASS $METHOD entering"); 

J'ai essayé toutes sortes de combos {} pour obtenir la valeur de la variable de l'auto :: CLASSE $, mais rien n'a fonctionné. Je suis actuellement installé avec concaténation de chaîne, mais il est une douleur de type:

log(self::$CLASS . " $METHOD entering"); 
+6

log (. :: auto $ class "entrant METHOD $"); est UN caractère supplémentaire à saisir au lieu de log ("self :: $ CLASS $ METHOD entry"); .. c'est une douleur? –

+1

Ce n'est pas si grave, mais l'autre est légèrement plus facile à lire et à taper. :) Je me demandais juste s'il y avait une alternative si vous n'étiez pas concerné par l'optimisation. – Chris

+4

@Scott: Le découragement n'est pas une réponse – cmc

Répondre

16

Désolé, vous ne pouvez pas faire cela. Cela ne fonctionne que pour des expressions simples. Voir here.

+0

"Puisque {ne peut pas être échappé, cette syntaxe ne sera reconnue que si le $ suit immédiatement le {." Si je comprends bien, "{self :: $ METHOD}" ne fonctionnera pas car le caractère $ doit suivre directement l'accolade gauche. – Chris

3

Je ne connais pas la réponse à votre question, mais vous pouvez afficher le nom de la classe et la méthode utilisant la __METHOD__magic constant.

+0

Merci. C'était utile. Je passe de Java et je n'ai pas eu l'occasion de creuser dans les constantes magiques. Je vais les utiliser au lieu de définir des variables de classe et de méthode. – Chris

1

Vivez simplement avec la concaténation. You'd be surprised how inefficient variable interpolation in strings can be.

Et même si cela pourrait relever de la pré-optimisation ou de la micro-optimisation, je ne pense pas que vous gagniez en élégance dans cet exemple.

Personnellement, si je vais faire une petite optimisation de l'un ou de l'autre, et que mes choix sont "plus rapides" et "plus faciles à taper" - je vais choisir "plus vite". Parce que vous ne tapez que quelques fois, mais il va probablement s'exécuter des milliers de fois.

+4

Le découragement n'est pas une réponse. – cmc

+1

On dirait que ce permalien est tout sauf. –

+2

Cette discussion de l'interpolation de chaîne n'est peut-être pas toujours vraie: selon Rasmus Lerdorf (via Twitter), c'est un compromis entre 1 opcode et tmp var, et les performances sont similaires. – IMSoP

-1

Oui cela peut être fait:

log("{${self::$CLASS}} $METHOD entering"); 
+0

Oui, cela est autorisé, mais il n'obtient pas l'effet désiré - il traitera 'self :: $ CLASS' comme un nom de variable; donc si 'self :: $ CLASS == 'foo'' alors vous finirez par' {$ foo}', et pas '' foo'' comme vous pourriez vous y attendre. –

4

Malheureusement, il n'y a aucun moyen comment faire encore. Exemple dans l'une des réponses ici ne fonctionnera pas, car {${self::$CLASS}} ne renverra pas le contenu de self::$CLASS, mais retournera le contenu de la variable avec le nom dans self::$CLASS.

Voici un exemple qui ne myvar retours, mais aaa:

$myvar = 'aaa'; 
self::$CLASS = 'myvar'; 
echo "{${self::$CLASS}}"; 
Questions connexes