2010-05-30 9 views
14

Esto imprime manzana:Las constantes entre comillas no se imprimen?

define("CONSTANT","apple"); 
echo CONSTANT; 

Pero esto no es así:

echo "This is a constant: CONSTANT"; 

¿Por qué?

+0

No entiendo. ¿Cuál es su resultado esperado para el segundo caso? 'Esto es una manzana: ¿A'? –

+0

Mi mal. Corregido .. – Yeti

+4

Piense en cuánto trabajo analizar cadenas de comillas dobles sería si el analizador tuviera que verificar si alguna subcadena coincidía con una constante definida ... Y se ralentizaría a medida que definiera más constantes. Y, ¡tendría que escapar de la letra mayúscula A dentro de TODAS sus cadenas después de definir esa constante! – grossvogel

Respuesta

22

Porque "las constantes dentro de las comillas no se imprimen". La forma correcta es:

echo "This is a constant: " . CONSTANT; 

El punto es el operador de concatenación.

+13

Tan pronto como haya '" {$ var} "', esperaba '" {CONSTANT} "' para que coincida también con la sintaxis de interpolación de cadenas. –

5

Si desea incluir referencias a variables dentro de cadenas, debe usar una sintaxis especial. Esta característica se llama cadena de interpolación y está incluida en la mayoría de los lenguajes de scripting.

This page describe la característica en PHP. Parece que las constantes no se reemplazan durante la interpolación de cadenas en PHP, por lo que la única forma de obtener el comportamiento que desea es usar la concatenación que sugiere Artefacto.

De hecho, acabo de encontrar another post decir tanto:

yo sepa, con variables estáticas, uno tiene el mismo 'problema' al igual que con las constantes: sin interpolación es posible, sólo tiene que utilizar variables temporales o concatenación.

+2

La razón por la que no puede usar la sintaxis especial '{}' con constantes es simple: los paréntesis solo se reconocen como "sintaxis especial" si '{' es seguido inmediatamente por un '$'. Pero las constantes no tienen eso ... –

+0

El '$' se suele llamar sigil. No he visto ninguna documentación sólida y rápida que diga que las interpolaciones de cadenas solo funcionan en variables y expresiones con un '$', pero cada ejemplo de interpolación de cadenas en PHP lo puedo usar. La postulación de grossvogel es probablemente la razón muy razonable por la que esto es así. – jasonmp85

+1

OP también podría usar [sprintf] (http://php.net/manual/en/function.sprintf.php) como una forma simple de obtener el mismo resultado. 'sprintf ('Esto es una constante:% s', CONSTANTE);' – kojiro

16
define('QUICK', 'slow'); 
define('FOX', 'fox'); 

$K = 'strval'; 

echo "The {$K(QUICK)} brown {$K(FOX)} jumps over the lazy dog's {$K(BACK)}."; 
+5

En caso de que no sea aparente, el gran problema con la técnica de llamada a función indirecta es que $ K no está en el espacio de nombres global, por lo que debe declararse con 'global $ K;' en cada función que necesita usarlo. – gregjor

0

concatenación Se ha sugerido que la única solución a este problema, pero eso no funciona cuando se utiliza una sintaxis como:

define("MY_CONSTANT", "some information"); 
    $html = <<< EOS 
    <p>Some html, **put MY_CONSTANT here**</p> 
EOS; 

Por supuesto, lo anterior sólo pone el texto 'MY_CONSTANT' en $ html

Otras opciones incluyen:

  • definir una variable temporal para mantener la constante:

    $myConst = MY_CONSTANT; 
        $html = <<< EOS 
        <p>Some html, {$myConst} </p> 
    EOS; 
    
  • si hay muchas constantes, se puede obtener una matriz de todas ellas y el uso que:

    $constants = get_defined_constants(); 
        $html = <<< EOS 
        <p>Some html, {$constants["MY_CONSTANT"]} </p> 
    EOS; 
    

Por supuesto, en un ejemplo trivialmente corto, no hay razón para usar el operador < < <, pero con un bloque de salida más largo, los dos anteriores pueden ser mucho más claros y fáciles de mantener que un montón de concatenación de cadenas.

Cuestiones relacionadas