2010-05-30 14 views
14

Questo stampa mela:Le costanti all'interno delle virgolette non vengono stampate?

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

Ma questo non lo fa:

echo "This is a constant: CONSTANT"; 

Perché?

+0

Non capisco. Qual è il tuo output previsto per il secondo caso? 'Questa è una mela: A'? –

+0

Il mio male. Risolto il problema ... – Yeti

+4

Pensate a quanto lavoro analizzerebbe le stringhe tra virgolette doppie se il parser dovesse verificare se una sottostringa corrispondesse a una costante definita ... E rallenterebbe quando definite più costanti. E, dovresti scappare dalla lettera maiuscola A dentro TUTTE le tue stringhe dopo aver definito quella costante! – grossvogel

risposta

22

Perché "le costanti all'interno delle virgolette non vengono stampate". La forma corretta è:

echo "This is a constant: " . CONSTANT; 

Il punto è l'operatore di concatenazione.

+13

Non appena c'è '" {$ var} "', mi aspettavo '" {CONSTANT} "' per abbinare anche la sintassi di interpolazione della stringa. –

5

Se si desidera includere riferimenti a variabili all'interno di stringhe è necessario utilizzare la sintassi speciale. Questa funzione è chiamata interpolazione stringa ed è inclusa nella maggior parte dei linguaggi di scripting.

This page descrive la funzionalità in PHP. Sembra che le costanti non vengano sostituite durante l'interpolazione delle stringhe in PHP, quindi l'unico modo per ottenere il comportamento desiderato è usare la concatenazione suggerita da Artefacto.

Infatti, ho appena trovato another post dire tanto:

per quanto ne so, con le variabili statiche, si ha lo stesso 'problema' come con costanti: senza interpolazione possibile, basta usare variabili temporanee o concatenazione.

+2

Il motivo per cui non è possibile utilizzare la sintassi speciale '{}' con le costanti è semplice: le parentesi sono riconosciute come "sintassi speciale" se '{' è immediatamente seguito da un '$'. Ma le costanti non hanno questo ... –

+0

Il '$' viene solitamente chiamato un sigillo. Non ho visto alcuna documentazione veloce e veloce che dica che le interpolazioni di stringa funzionano solo su variabili ed espressioni con un '$', ma ogni esempio di interpolazione di stringhe in PHP che posso trovare lo usa. la postulazione di grossvogel è probabilmente la ragione molto ragionevole per cui è così. – jasonmp85

+1

OP potrebbe anche usare [sprintf] (http://php.net/manual/en/function.sprintf.php) come un modo semplice per ottenere lo stesso risultato. 'sprintf ('Questa è una costante:% s', COSTANTE);' – 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

Nel caso non sia evidente, il grosso problema con la tecnica della chiamata di funzione indiretta è che $ K non è nello spazio dei nomi globale, quindi deve essere dichiarato con 'global $ K;' in ogni funzione che deve essere utilizzata. – gregjor

0

concatenazione è stato suggerito come l'unica soluzione qui, ma che non funziona quando si utilizza la sintassi del tipo:

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

Naturalmente, quanto sopra appena mette il testo 'MY_CONSTANT' in $ html.

Altre opzioni includono:

  • definire una variabile temporanea per contenere la costante:

    $myConst = MY_CONSTANT; 
        $html = <<< EOS 
        <p>Some html, {$myConst} </p> 
    EOS; 
    
  • se ci sono molte costanti, è possibile ottenere una vasta gamma di tutti e l'uso che:

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

Ovviamente, in un esempio così banalmente breve, non c'è motivo di usare l'operatore < <, ma con un blocco di output più lungo i due precedenti possono essere molto più chiari e più facili da gestire rispetto a una serie di concatenazioni di stringhe!

Problemi correlati