2009-08-12 11 views
21

¿Cómo puedo obtener PHP para evaluar una variable estática entre comillas dobles?Variables estáticas PHP en comillas dobles

quiero hacer algo como esto:

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

He intentado todo tipo de combos {} para obtener el valor de la variable de self :: $ CLASE, pero nada ha funcionado. Actualmente me he adaptado con la concatenación de cadenas, pero es un dolor que escribir:

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

registro (. Self :: $ class "Introducción de $ MÉTODO"); es UN carácter adicional para escribir en lugar de registrar ("self :: $ CLASS $ METHOD entering"); .. esto es un dolor? –

+1

No es tan malo, pero el otro es un poco más fácil de leer y escribir. :) Me preguntaba si había una alternativa si no te preocupaba la optimización. – Chris

+4

@Scott: Desanimar no es una respuesta – cmc

Respuesta

16

Lo siento, no puedes hacer eso. Solo funciona para expresiones simples. Ver here.

+0

"Como {no se puede escapar, esta sintaxis solo se reconocerá cuando el $ siga inmediatamente al {." Si entiendo esto correctamente, "{self :: $ METHOD}" no funcionará porque el carácter $ debe seguir directamente el corchete izquierdo. – Chris

3

no sé la respuesta a su pregunta, pero se puede mostrar el nombre de la clase y el método mediante el __METHOD__magic constant.

+0

Gracias. Esto fue útil. Me estoy moviendo desde Java y no he tenido la oportunidad de profundizar en las constantes mágicas. Los usaré en lugar de definir las variables de clase y método. – Chris

1

Simplemente viva con la concatenación. You'd be surprised how inefficient variable interpolation in strings can be.

Y si bien esto podría caer bajo el paraguas de la pre-optimización o la micro-optimización, no creo que ganes elegancia en este ejemplo.

Personalmente, si voy a hacer una pequeña optimización de uno u otro, y mis elecciones son "más rápidas" y "más fáciles de escribir", voy a elegir "más rápido". Porque solo lo escribe algunas veces, pero probablemente se ejecutará miles de veces.

+4

Desanimar no es una respuesta. – cmc

+1

Parece que ese enlace permanente es todo lo contrario. –

+2

El debate sobre la interpolación de cadenas puede no ser cierto: según Rasmus Lerdorf (a través de Twitter), se trata de una transacción de 1 opcode vs tmp var, y el rendimiento es similar. – IMSoP

-1

Si esto se puede hacer:

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

Sí, está permitido, pero no logra el efecto deseado; tratará a 'self :: $ CLASS' como un nombre de variable; entonces, si 'self :: $ CLASS == 'foo'' luego terminarás con' {$ foo} ', y no'' foo'' como estarías esperando. –

4

Desafortunadamente no hay manera de cómo hacer esto todavía. El ejemplo en una de las respuestas aquí no funcionará, porque {${self::$CLASS}} no devolverá el contenido de self::$CLASS, pero devolverá el contenido de la variable con el nombre en self::$CLASS.

Aquí es un ejemplo, que no vuelve myvar, pero aaa:

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