PHP: concatena o inserisce direttamente le variabili nella stringa


224

Mi chiedo: qual è il modo corretto di inserire variabili PHP in una stringa?

Per di qua:

echo "Welcome ".$name."!"

O in questo modo:

echo "Welcome $name!"

Entrambi questi metodi funzionano nel mio PHP v5.3.5. Quest'ultimo è più breve e semplice, ma non sono sicuro che il primo sia una formattazione migliore o sia accettato come più appropriato.


18
se stavi facendo il primo, preferisco personalmente una singola citazioneecho 'Welcome '.$name.'!';
KJYe.Name 葉家仁


2
@ kjy112 Ho detto la stessa cosa nella mia risposta, sono un ENORME fan delle virgolette singole: X
Khez

11
Personalmente, ignoro l'intero "virgolette singole sono più efficienti" e vado semplicemente a "utilizzare qualsiasi stile di quotazione che richieda l'ultima quantità di escape interno". È altamente improbabile che qualsiasi codice che scrivi trarrà beneficio da eventuali guadagni MICROSCOPICI a causa della minore analisi delle stringhe rispetto all'aumentata concatenazione delle stringhe.
Marc B,

1
Il reclamo per perdita di prestazione è falso. Vedi questo articolo come riferimento: nikic.github.io/2012/01/09/…
Damian,

Risposte:


344

Tra quelle due sintassi, dovresti davvero scegliere quella che preferisci :-)

Personalmente, andrei con la tua seconda soluzione in un caso del genere (interpolazione variabile) , che trovo più facile da scrivere e da leggere.

Il risultato sarà lo stesso; e anche se ci sono implicazioni sulle prestazioni, quelle non contano 1 .


Come sidenote, quindi la mia risposta è un po 'più completa: il giorno in cui vorrai fare qualcosa del genere:

echo "Welcome $names!";

PHP interpreterà il tuo codice come se stessi tentando di usare la $namesvariabile, che non esiste. - nota che funzionerà solo se usi "" non '' per la tua stringa.

Quel giorno dovrai usare {}:

echo "Welcome {$name}s!"

Non è necessario il fallback alle concatenazioni.


Nota anche che la tua prima sintassi:

echo "Welcome ".$name."!";

Probabilmente potrebbe essere ottimizzato , evitando concatenazioni, usando:

echo "Welcome ", $name, "!";

(Ma, come ho detto prima, questo non ha molta importanza ...)


1 - A meno che tu non stia facendo centinaia di migliaia di concatenazioni contro interpolazioni - e probabilmente non è proprio il caso.


3
Eccellente grazie! è molto bello sapere che posso usare il mio metodo preferito per inserirlo direttamente nella stringa, e sono molto grato per ora sapere come separare la variabile dal resto della puntura se è necessario usare il {}.
Web_Designer

64
Basta notare che la separazione dei letterali di stringa e delle variabili con virgole funziona solo con echo, non altrove.
Colincameron,

3
Basta sottolineare la performance: time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = $string.$i; } print("Done!\n");'(Concatenazione) in realtà perde di circa 300 millisecondi (per 200.000 articoli, vale 1 miliseconf per mille elementi sul tuo set ...). Questo è rumore statistico, è impossibile persino misurare qualsiasi differenza. Considerando che è più leggibile, time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = "{$string}{$i}"; } print("Done!\n");'(Interpolazione) è il vincitore indiscusso ...
Fernando Cordeiro,

1
Se vuoi usare l'interpolazione, devi usare virgolette doppie.
Máxima Alekz,

è possibile utilizzare le funzioni all'interno della stringa? like echo "Questo è {foo ()} bello"; ?
strix25,

17

Le stringhe tra virgolette sono più eleganti perché non è necessario spezzare la stringa ogni volta che è necessario inserire una variabile (come è necessario fare con le stringhe tra virgolette singole).

Tuttavia, se è necessario inserire il valore restituito di una funzione, questa non può essere inserita in una stringa tra virgolette doppie, anche se la si racchiude tra parentesi graffe!

//syntax error!!
//$s = "Hello {trim($world)}!"

//the only option
$s = "Hello " . trim($world) . "!";

10
Puoi inserire le funzioni semi-indirettamente nelle stringhe tramite le funzioni variabili di PHP 5.3. $x = function() { ...}; $string = "hello {$x(blah blah blah)}", che aggira la "restrizione".
Marc B,

5
@Marc È fantastico, non lo sapevo! Puoi anche assegnare il nome di una funzione esistente a una variabile e fare la stessa cosa:$x = 'trim'; $string = "hello {$x('blah blah blah')}";
Michael,

3
è bello ma estremamente illeggibile, quindi bisogna comunque evitarlo.
Il tuo senso comune

2
$s = 'Hello ' . trim($world) .'!';Prova a utilizzare le virgolette singole quando non c'è nulla da interpolare nella stringa. Migliorerà le prestazioni e può essere usato come una convenzione per identificare entrambi
Sarath Sadasivan Pillai

9

Da php4 puoi usare un formatore di stringhe:

$num = 5;
$word = 'banana';
$format = 'can you say %d times the word %s';
echo sprintf($format, $num, $word);

Fonte: sprintf ()


Di gran lunga l'opzione più sicura. +1 per le buone pratiche e le convenzioni generali corrispondenti ad altre lingue
Javier Arias,

6

Qualunque dei due va bene. Usa quello che ha una migliore visibilità per te. E a proposito di visibilità puoi anche dare un'occhiata a printf .


5

Dal punto di vista del rendere le cose semplici , leggibili , coerenti e di facile comprensione (poiché le prestazioni non contano qui):

  • L'uso di variabili incorporate tra virgolette doppie può portare a situazioni complesse e confuse quando si desidera incorporare proprietà degli oggetti, matrici multidimensionali ecc. Cioè, in genere durante la lettura di variabili incorporate, non si può essere immediatamente sicuri al 100% del comportamento finale di ciò che si sta leggendo .

  • Spesso è necessario aggiungere stampelle come {}e \, che IMO aggiunge confusione e rende la leggibilità della concatenazione quasi equivalente, se non meglio.

  • Non appena è necessario racchiudere una chiamata di funzione in var, ad esempio htmlspecialchars($var), è necessario passare alla concatenazione.

  • AFAIK, non puoi incorporare costanti.

In alcuni casi specifici, "virgolette doppie con incorporamento variegato" può essere utile, ma in generale, vorrei concatenare (usando le virgolette singole o doppie quando è conveniente)


5

So che questa domanda ha già una risposta scelta, ma ho trovato questo articolo che mostra evidentemente che l'interpolazione di stringhe funziona più velocemente della concatenazione. Potrebbe essere utile per coloro che sono ancora in dubbio.


3

Vai con il primo e usa le virgolette singole!

  1. È più facile da leggere, il che significa che altri programmatori sapranno cosa sta succedendo
  2. Funziona leggermente più velocemente, il modo in cui vengono creati gli opcode quando PHP analizza il tuo codice sorgente, lo farà praticamente comunque, quindi dagli una mano!
  3. Se usi anche virgolette singole invece di doppie virgolette aumenterai ulteriormente le tue prestazioni.

Le uniche situazioni in cui è necessario usare le virgolette, è quando è necessario \r, \n, \t! Il sovraccarico non vale la pena usarlo in nessun altro caso.

Dovresti anche controllare la concatenazione delle variabili PHP , phpbench.com per alcuni benchmark su diversi metodi di fare le cose.


19
-1: L'uso di virgolette singole non ha alcun effetto sulla vita reale sulle prestazioni. La pagina collegata mostra le differenze tra i due metodi in microsecondi , ovvero 0,000001 secondi. Qualunque query sul database impiegherà centinaia di volte quel tempo. Questo dibattito è del tutto inutile.
Pekka,

Un buon punto per menzionare \r, \ne \tcome altre risposte non includevano questo bit.
evilReiko,

2

È solo questione di gusti.
Usa quello che desideri.

Il più delle volte sto usando il secondo ma dipende.

Lascia che ti suggerisca anche di procurarti un buon editor che evidenzierà una variabile all'interno di una stringa


Ho la textarea necessaria. Rocce PSPad .
Web_Designer

2

Non concatenare. Non è necessario, noi virgole poiché l'eco può accettare più parametri

echo "Welcome ", $name, "!";

Per quanto riguarda l'utilizzo di virgolette singole o doppie, la differenza è trascurabile, è possibile eseguire test con un numero elevato di stringhe da testare da soli.


6
Questo vale solo per l'eco, però. Provalo per un compito variabile e guarda il tuo codice esplodere.
Marc B,

1

Dovresti scegliere il primo. Non hanno alcuna differenza se non le prestazioni, la prima sarà la più veloce nel confronto della seconda.

Se la variabile all'interno della doppia virgoletta PHP impiega del tempo per analizzare la variabile.

Dai un'occhiata a Virgolette singole o doppie per concatenazione variabile?

Questo è un altro esempio. C'è un vantaggio in termini di prestazioni tra virgolette singole e virgolette doppie in php?

Non ho capito perché questa risposta nel link sopra sia stata votata e perché questa risposta sia stata votata.

Come ho detto la stessa cosa.

Puoi guardare anche qui

Cosa c'è di più veloce tra virgolette PHP, singole o doppie?


5
-1 per ottimizzazione prematura. La differenza nelle prestazioni non è sufficiente per essere un fattore a meno che tu non stia stampando milioni di volte in uno script - e anche in questo caso, qualsiasi altra elaborazione che eseguirai ridurrà il paio di secondi in più che potresti impiegare a stampare in un modo anziché nell'altro . La principale differenza tra loro è la leggibilità (che mi porta a preferire il secondo stile).
cHao,

1
Posso provare a rispondere alla tua ultima domanda. Ci sono molte indiscrezioni nella comunità di PHP e alcune sono molto forti. È una grande lotta per rivelarli e richiede tempo. Ma lentamente sta cambiando. Quindi, la risposta a cui ti sei collegato è vecchia, dai tempi in cui alla gente non importava. Mentre in questo alcune persone hanno risposto sulla base della propria esperienza, non su alcuni articoli che hanno letto.
Il tuo senso comune

La perdita di prestazioni è falsa +1 @cHao. Ecco un articolo con le metriche che lo dimostrano. nikic.github.io/2012/01/09/…
Damian,

1

Se si desidera eseguire un SQLcomando e le variabili sono membri dell'array, non è necessario utilizzare virgolette singole all'interno []dell'array (come questo:) ['']; per esempio se usi questa stringa come comando SQL, otterrai server error 500:

$con = mysqli_connect('ServerName', 'dbUsername', 'dbPassword');
mysqli_select_db($con, 'dbName')

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray['TraceNo']')";
mysqli_query($con, $sql)

La stringa corretta è:

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray[TraceNo]')";

Dovresti invece usare i PDO
s3c

0

So che questa è una vecchia domanda, ma penso che qualcuno debba menzionare tutti i pro e contro:

Sintassi migliore : questa è la preferenza personale.

Prestazioni : nessuna differenza. Come molti hanno già detto, la doppia virgoletta potrebbe essere più veloce se si utilizzano in modo irrealistico molte variabili.

Migliore utilizzo : virgoletta singola (principalmente). Come ha detto @Khez, con apice singolo è possibile concatenare qualsiasi cosa, anche le chiamate di funzione e modifica variabile, in questo modo: echo 'hi ' . trim($name) . ($i + 1);. Il doppio-citazione unica cosa che può fare una sola citazione non può fare è l'utilizzo di \n, \r, \te simili.

Precisione di lettura : nessuna differenza (possono essere applicate preferenze personali).

Writability / Re-Writability / Debugging : nelle istruzioni a 1 riga non c'è alcuna differenza, ma quando si ha a che fare con più righe, è più facile commentare / commentare le righe durante il debug o la scrittura. Per esempio:

$q = 'SELECT ' .
     't1.col1 ' .
     ',t2.col2 ' .
   //',t3.col3 ' .
     'FROM tbl1 AS t1 ' .
     'LEFT JOIN tbl2 AS t2 ON t2.col2 = t1.col1 ' .
   //'LEFT JOIN tbl3 AS t3 ON t3.col3 = t2.col2 ' .
     'WHERE t1.col1 = ' . $x . ' ' .
     '  AND t2.col2 = ' . $y . ' ' .
   //'  AND t3.col3 = ' . $z . ' ' .
     'ORDER BY t1.col1 ASC ' .
     'LIMIT 10';

Meno escape : virgoletta singola. Per virgoletta singola è necessario scappare solo 2 caratteri ( 'e \). Per le virgolette doppie devi scappare 2 caratteri ( ", \) e altri 3 se richiesti ( $, {e }).

Meno cambiamenti : virgoletta singola. Ad esempio se hai il seguente codice:

echo 'Number ' . $i . '!';

E devi aumentare da 1 a $ i, quindi diventa like:

echo 'Number ' . ($i + 1) . '!';

Ma per una doppia citazione, dovrai cambiare questo:

echo "Number $i!";

a questa:

echo "Number " . ($i + 1) . "!";

Conclusione : usa ciò che preferisci .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.