Php virgolette singole e doppie. Differenza tra virgolette doppie e singole in PHP. Esempio n. 3 Esempio di definizione di stringa Heredoc

Come hai visto nel tutorial precedente, il comando echo in php è un mezzo per generare testo. Nel corso della tua carriera in PHP, utilizzerai il comando echo più di ogni altro. Quindi diamo un'occhiata bene!

Uscita di linea

Per produrre una stringa, come abbiamo fatto nelle lezioni precedenti, viene utilizzato l'eco. Con il suo aiuto, puoi visualizzare testo tra virgolette, valori variabili, ecc. Diamo un'occhiata a un esempio.

Adoro usare PHP!"; ?>

Emettere la frase "Ciao!" Ci siamo già familiari, non c'è niente di nuovo qui. Ma il successivo comando echo, come puoi vedere, contiene un tag html. L'uso dei tag html non è vietato, perché php ci fornisce dinamica e la statica e il design della pagina sono ancora in balia del normale html.

Attenzione, virgolette doppie!

È molto interessante poter generare HTML all'interno di PHP. Tuttavia, dovresti fare attenzione quando usi il codice HTML o qualsiasi altra stringa contenente virgolette! Echo utilizza le virgolette per definire l'inizio e la fine di una stringa, quindi devi utilizzare una delle seguenti opzioni se desideri utilizzare le virgolette all'interno di echo:

  • Non utilizzare virgolette all'interno di una stringa.
  • Evita le virgolette interne con una barra. Per evitare di elaborare le virgolette interne, è sufficiente inserire una barra rovesciata subito prima, ad esempio \".
  • Utilizzare virgolette singole (apostrofi) all'interno della stringa.

Vedi il nostro esempio qui sotto per l'utilizzo corretto e errato del comando echo:

Adoro usare PHP!"; // OK perché abbiamo eliminato le virgolette! echo "

Adoro usare PHP!
"; // OK perché abbiamo usato l'apostrofo " echo "
Adoro usare PHP!
"; ?>

Se vuoi restituire una stringa contenente virgolette, usa un apostrofo (') o evita le virgolette inserendo una barra (\") davanti ad esse. La barra rovesciata dirà a PHP che vuoi che il carattere successivo non venga analizzato dall'interprete!

Uscita variabile

Derivare le variabili è molto semplice. In effetti, non è necessario fare nulla di speciale per visualizzare le variabili in PHP. Può farlo da solo. Ecco un esempio per farti capire il tutto:

Risultato:

Ciao Bob. Il mio nome è: 4a

Output simultaneo di variabili e stringhe di testo

È inoltre possibile visualizzare le variabili tra virgolette doppie (ad esempio, "testo testo $variabile"). Inserendo una variabile tra virgolette ("") dici a PHP che vuoi che prenda il suo valore, lo converta in un tipo di stringa e lo visualizzi in output. L'esempio seguente mostra come eseguire correttamente questo trucco :)

"; echo "Ciao, sono Bob. Chi sei? $my_string
"; echo "Ciao, sono Bob. Chi sei? $my_string Bobetta"; ?>

Risultato:

Ciao Bob. Il mio nome è: Bobetta Ciao, sono Bob. Chi sei? Ciao Bob. Il mio nome è: Ciao, sono Bob. Chi sei? Ciao Bob. Il mio nome è: Bobetta

Posizionare le variabili all'interno di una riga può far risparmiare tempo e rendere il codice più facile da leggere, ma è necessario un po' di tempo per abituarsi. Ricordarsi di utilizzare le virgolette, le virgolette singole non restituiranno valori variabili. Le virgolette singole restituiranno semplicemente il nome della variabile in una stringa, ad es. $mia_stringa, non "Ciao Bob. Mi chiamo."

L'eco non è una funzionalità!

L'eco non è una funzione, ma un costrutto linguistico. Quando si utilizzano le funzioni in PHP, hanno una forma molto specifica, che esamineremo sicuramente un po' più tardi. Per ora, sappi solo che l'eco è uno strumento speciale che sicuramente adorerai! :D

Concatenazione di stringhe PHP

Forse l'operazione più comune con le stringhe è la loro concatenazione, ovvero l'unione di una stringa ad un'altra. Per concatenare le stringhe è stato introdotto un operatore speciale “.” (punto).

Esempio:


In uscita otteniamo l'intera frase: "Il mio paese natale è ampio!"

I valori di tipo string sono stringhe di testo (stringhe in breve). Una stringa è una sequenza di zero o più caratteri. I caratteri includono lettere, numeri, punteggiatura, caratteri speciali e spazi.

Una stringa può essere definita in quattro modi diversi:

  • virgolette doppie
  • virgolette singole
  • sintassi heredoc
  • sintassi nowdoc

Stringa tra virgolette doppie

Stringa tra virgolette doppie:

È possibile utilizzare sequenze di escape nelle stringhe tra virgolette doppie. Sequenza di controllo— si tratta di caratteri speciali progettati per formattare l'output di testo. In PHP sono disponibili le seguenti sequenze di escape:

La proprietà principale delle stringhe tra virgolette doppie è la capacità di gestire le variabili all'interno delle stringhe.


Segno del dollaro: \$";

Le stringhe racchiuse tra virgolette doppie possono contenere caratteri di virgolette singole:

Echo "Apice singola: "";

Stringa tra virgolette singole (apostrofi)

Stringa tra virgolette singole:

$str = "Stringa"; echo "Una riga grande può essere suddivisa in più righe piccole per facilitarne la lettura.";

A differenza delle stringhe tra virgolette doppie e della sintassi heredoc, le variabili e le sequenze di controllo (con un'eccezione) racchiuse tra virgolette singole non vengono elaborate. Ciò significa che verranno interpretati come normali caratteri di stringa:

$num = 10; echo "Numero: $num
Segno del dollaro: \$";

Per poter utilizzare virgolette singole in una stringa racchiusa tra virgolette singole, è necessario eseguire l'escape utilizzando una barra rovesciata (\"). Se è necessario scrivere la barra rovesciata stessa, è necessario duplicarla (\\):

Echo "Utilizza virgolette \"singole\" all'interno"; echo "Barra rovesciata: \\";

Le stringhe racchiuse tra virgolette singole possono contenere caratteri di virgolette doppie:

Echo "Virgolette doppie: "";

Sintassi Heredoc

La sintassi Heredoc è un modo alternativo per scrivere stringhe.

Una stringa definita utilizzando la sintassi Heredoc funziona allo stesso modo di una stringa racchiusa tra virgolette doppie. La differenza tra Heredoc e una stringa tra virgolette doppie è che con Heredoc non è necessario sfuggire alle virgolette doppie.

La sintassi di Heredoc inizia con tre caratteri<<< , после которых должен быть указан произвольный идентификатор (назовём его открывающим). Идентификатор может быть указан как в двойных кавычках, так и без них. Subito l'identificatore deve essere seguito da una nuova riga; nessun altro carattere oltre alla nuova riga deve essere seguito dall'identificatore, altrimenti si verificherà un errore. Poi arriva il contenuto della stringa stessa. Dopo il contenuto della stringa, su una riga separata, deve essere specificato un identificatore di chiusura (lo stesso di after<<<). Перед ним и после него не должно быть никаких пробелов или других символов, за исключением точки с запятой. Если это правило нарушено, то считается, что закрывающий идентификатор отсутствует и будет вызвана ошибка:

<<

Sintassi Nowdoc

La sintassi Nowdoc, come Heredoc, è un modo alternativo per scrivere stringhe.

Una stringa definita utilizzando la sintassi Nowdoc funziona allo stesso modo di una stringa racchiusa tra virgolette singole. La differenza tra Nowdoc e una stringa con virgolette singole è che con Nowdoc non è necessario eseguire l'escape delle virgolette singole.

La sintassi di Nowdoc è simile a Heredoc, con l'unica differenza che l'identificatore di apertura deve essere racchiuso tra virgolette singole:

$num = 10; eco<<<"some_id" Число: $num some_id;

Gestione delle variabili nelle stringhe

Esistono due tipi di sintassi per la gestione delle variabili nelle stringhe: semplice E difficile.

Sintassi semplice- questo è quando il nome della variabile viene indicato nella riga così com'è.

Quando l'interprete incontra il simbolo del dollaro, inizia a verificare in sequenza se tutti i caratteri successivi sono caratteri validi nel nome della variabile. Quindi, per formare un nome di variabile valido, acquisisce il maggior numero di caratteri possibile:

$str = "Mondo!"; echo "Ciao $str";

Sintassi complessa- questo è quando il nome della variabile è racchiuso tra parentesi graffe.

Poiché, per elaborare una variabile in una riga, l'interprete cattura quanti più caratteri possibile, ci sono situazioni in cui l'interprete non è in grado di determinare autonomamente dove finisce il nome della variabile:

$sport1 = "volontà"; $sport2 = "piede"; echo "Mi piacciono $sport1ball e $sport2ball";

In questo caso il risultato desiderato non verrà raggiunto perché l'interprete considererà $sport1 come parte del nome della variabile $sport1bol, che non esiste.

Per dire esplicitamente all'interprete dove finisce il nome di una variabile, è necessario racchiudere il nome della variabile tra parentesi graffe:

$sport1 = "volontà"; $sport2 = "piede"; echo "Mi piacciono ($sport1)bol e ($sport2)bol.";

Il simbolo del dollaro può essere posizionato prima o dopo la parentesi graffa:

$sport1 = "volontà"; $sport2 = "piede"; echo "Mi piacciono $(sport1)bol e ($sport2)bol.";

Concatenazione

La concatenazione è l'unione di due o più stringhe in una stringa più grande. La concatenazione avviene utilizzando l'operatore di concatenazione - . (punto). Durante la concatenazione, ogni riga successiva viene aggiunta alla fine di quella precedente:

Un valore di qualsiasi tipo concatenato con una stringa verrà convertito implicitamente in una stringa e quindi concatenato:

"; echo "Numero: " . 1; ?>

Il modo più semplice per definire una stringa è racchiuderla tra virgolette singole (il carattere " ).

Per utilizzare una virgoletta singola all'interno di una stringa, esegui l'escape con una barra rovesciata ( \ ). \\ Se devi scrivere la barra rovesciata stessa, duplicala ( ). Tutti gli altri usi delle barre rovesciate verranno interpretati come caratteri normali: questo significa che se provi a utilizzare altre sequenze di escape come \R O

\N , verranno visualizzati così come sono invece di qualsiasi comportamento speciale.;

\N eco
"questa è una stringa semplice"
"Puoi anche inserire nelle righe
;

carattere di nuova riga come questo,
\N Questo va bene";

// Risultati: Arnold una volta disse: "Tornerò" "Un giorno Arnold disse: 'Tornerò''.;

Eco
"Hai eliminato C:\\*.*?"

// Risultato: hai eliminato C:\*.*?
\N "Questo non verrà espanso: \n newline";

// Risultati: le variabili $expand e $oither non vengono espanse
\N "Le variabili $expand e $oither non vengono espanse";
?>

virgolette doppie

Se la stringa è racchiusa tra virgolette doppie ("), PHP riconosce più sequenze di escape per caratteri speciali:

Sequenze di fuga
Successione Senso
\R nuova riga (LF o 0x0A (10) in ASCII)
). ritorno a capo (CR o 0x0D (13) in ASCII)
\T tab orizzontale (HT o 0x09 (9) in ASCII)
\v scheda verticale (VT o 0x0B (11) in ASCII) (da PHP 5.2.5)
\e carattere di escape (ESC o 0x1B (27) in ASCII) (da PHP 5.4.4)
\F feed di pagina (FF o 0x0C (12) in ASCII) (da PHP 5.2.5)
\\ barra rovesciata
\$ segno del dollaro
\" doppia virgoletta
\{1,3} sequenza di caratteri corrispondente a un'espressione regolare di un carattere nel sistema numerico ottale
\x(1,2) sequenza di caratteri corrispondente all'espressione regolare di un carattere in notazione esadecimale

Come con una stringa racchiusa tra virgolette singole, l'escape di qualsiasi carattere produrrà anche la barra rovesciata stessa. Prima di PHP 5.1.1, barra rovesciata \($var) non è stato pubblicato.

Heredoc

Il terzo modo per definire le stringhe è utilizzare la sintassi heredoc: <<< . Dopo questo operatore, è necessario specificare un identificatore, quindi un avanzamento riga. Dopo viene la riga stessa, e poi lo stesso identificatore, che chiude l'inserimento.

Linea Dovrebbe iniziare con un identificatore di chiusura, ad es. deve apparire nella prima colonna della riga. Inoltre, l'identificatore deve seguire le stesse regole di denominazione di tutti gli altri tag in PHP: contenere solo caratteri alfanumerici e un carattere di sottolineatura e non deve iniziare con un numero (i caratteri di sottolineatura sono consentiti).

Attenzione

È molto importante notare che la riga identificativa di chiusura non deve contenere altri caratteri tranne il punto e virgola ( ; ). Ciò significa che l'id non dovrebbe essere rientrato e che non possono esserci spazi o tabulazioni prima o dopo il punto e virgola. È anche importante comprendere che il primo carattere prima dell'identificatore di chiusura deve essere un carattere di nuova riga come definito dal sistema operativo. Ad esempio, sui sistemi UNIX, incluso Mac OS X, questo \R. Dopo l'identificatore di chiusura deve iniziare immediatamente anche una nuova riga.

Se questa regola viene violata e l'identificatore di chiusura non è "pulito", l'identificatore di chiusura viene considerato mancante e PHP continuerà a cercarlo ulteriormente. Se in questo caso non viene mai trovato l'identificatore di chiusura corretto, si verificherà un errore di analisi con il numero di riga alla fine dello script.

Heredoc non può essere utilizzato per inizializzare i campi della classe.

A partire da PHP 5.3, questa restrizione si applica solo agli heredoc contenenti variabili.

Esempio n. 1 Esempio sbagliato
classe pippo (<<pubblico $bar =
sbarra
}
?>

EOT;

Il testo Heredoc si comporta allo stesso modo di una stringa tra virgolette doppie, senza averle. Ciò significa che non è necessario eseguire l'escape delle virgolette in heredoc, ma è comunque possibile utilizzare le sequenze di escape sopra.

Le variabili vengono elaborate, ma è necessario prestare la stessa attenzione quando si utilizzano variabili complesse all'interno di heredoc come quando si lavora con le stringhe.<<Esempio n.2 Esempio di definizione di una stringa heredoc
$str =
Riga di esempio,
coprendo più righe,

utilizzando la sintassi heredoc.
{
EOD;
Foo di classe

var$foo;
{
var $barra;
Funzione pippo()
}
}

$questo -> foo = "Foo";
$questo ->

$foo = nuovo pippo();<<$nome = "Il mio nome"; .
eco
Il mio nome è "$nome". Digito $foo -> foo .
Ora sto deducendo
( $foo -> barra [ 1 ])
?>

Questo dovrebbe produrre la lettera maiuscola "A": \x41

EOT;

Il mio nome è "Il mio nome". Scrivo Foo. Ora emetto Bar2. Questo dovrebbe produrre una lettera maiuscola "A": A

È anche possibile utilizzare la sintassi heredoc per passare i dati attraverso gli argomenti della funzione:

Dalla versione 5.3.0, è diventato possibile inizializzare variabili statiche e proprietà/costanti di classe utilizzando la sintassi heredoc:
Esempio n.4 Utilizzo di heredoc per inizializzare variabili statiche
{
// Variabili statiche<<funzione pippo()
statico $bar =
}

Non c'è niente qui...
ETICHETTA;
{
// Proprietà/costanti della classe<<classe foo
const BAR =

Esempio di utilizzo di una costante<<FOOBAR;
const BAR =
}
?>

Pubblico $baz =

Esempio di utilizzo di un campo

A partire da PHP 5.3.0, puoi anche racchiudere l'identificatore Heredoc tra virgolette doppie: Oradoc Nowdoc è lo stesso per le stringhe con virgolette singole come heredoc lo è per le stringhe con virgolette doppie. Nowdoc è simile a heredoc, ma al suo interno

Nowdoc è indicato dalla stessa sequenza <<< , che viene utilizzato in heredoc, ma il seguente identificatore è racchiuso tra virgolette singole, ad esempio, <<<"EOT" .

Tutte le condizioni che si applicano agli identificatori heredoc si applicano anche a nowdoc, specialmente quelle che si applicano all'identificatore di chiusura.

Le variabili vengono elaborate, ma è necessario prestare la stessa attenzione quando si utilizzano variabili complesse all'interno di heredoc come quando si lavora con le stringhe.<<<"EOD"
Esempio n. 6 Esempio Nowdoc
Testo di esempio,
che si estende su più righe
coprendo più righe,

utilizzando la sintassi nowdoc.
ETICHETTA;
{
/* Esempio più complesso con variabili. */
pubblico $foo;

var$foo;
{
var $barra;
$bar pubblica;
}
}

$questo -> foo = "Foo";
$questo ->

$foo = nuovo pippo();<<<"EOT"
$questo -> barra = array("Bar1" , "Bar2" , "Bar3" );
Il mio nome è "$nome". Stampo $foo->foo.
Ora stampo ($foo->bar).
( $foo -> barra [ 1 ])
?>

Questo non dovrebbe produrre una "A" maiuscola: \x41

Il risultato dell'esecuzione di questo esempio:

Il mio nome è "$nome". Stampo $foo->foo. Ora stampo ($foo->bar). Questo non dovrebbe produrre una "A" maiuscola: \x41:

Commento

A differenza di heredoc, nowdoc può essere utilizzato in qualsiasi contesto con dati statici. Un tipico esempio di inizializzazione di campi o costanti di classe:

Esempio n. 1 Esempio sbagliato
classe pippo (<<<"EOT"
pubblico $bar =
( $foo -> barra [ 1 ])
}
?>

Il mio nome è "$nome". Stampo $foo->foo. Ora stampo ($foo->bar). Questo non dovrebbe produrre una "A" maiuscola: \x41:

Esempio n.7 Esempio di utilizzo di dati statici

Il supporto nowdoc è stato aggiunto in PHP 5.3.0.

Gestione delle variabili

Se una stringa viene specificata tra virgolette doppie o utilizzando heredoc, vengono elaborate le variabili al suo interno. Esistono due tipi di sintassi: semplice e complessa. La sintassi semplice è più semplice e conveniente. Rende possibile elaborare una variabile, un valore di array ( vettore) o proprietà dell'oggetto (

oggetto

) con il minimo sforzo.

La sintassi complessa può essere identificata dalle parentesi graffe che circondano l'espressione. $ Sintassi semplice

Se l'interprete incontra il simbolo del dollaro (

), acquisisce il maggior numero di caratteri possibile per formare un nome di variabile valido. Se vuoi specificare la fine di un nome, racchiudi il nome della variabile tra parentesi graffe.
$succo = "mela";
echo "Ha bevuto del succo di $juice." . PHP_EOL;
// non funziona, "s" è un carattere valido per un nome di variabile,
?>

Questo non dovrebbe produrre una "A" maiuscola: \x41

// ma la nostra variabile si chiama $juice.

echo "Ha bevuto del succo fatto con $succhi." ; Esistono due tipi di sintassi: semplice e complessa. Ha bevuto del succo di mela. Ha bevuto del succo di . vettore Un elemento dell'array ( ] ) o proprietà dell'oggetto (

).

Negli indici di array c'è una parentesi quadra di chiusura (

) segna la fine della definizione dell'indice.
Per le proprietà degli oggetti valgono le stesse regole che valgono per le variabili semplici.
echo "Ha bevuto del succo di $succhi [koolaid1]." . PHP_EOL;

persone di classe (
pubblico $giovanni = "Giovanni Smith";
pubblico $ Jane = "Jane Smith";
public $robert = "Robert Paulsen";

Pubblico $smith = "Smith";
}

$persone = nuove persone();

echo "$persone -> Giovanni ha bevuto dei $succhi di frutta [ 0 ]." . PHP_EOL;
echo "$persone -> john poi ha salutato $persone -> jane." . PHP_EOL;
echo "$persone -> la moglie di Giovanni ha salutato $persone -> Roberto." . PHP_EOL;
echo "$persone -> Robert ha salutato le due $persone -> fabbri." ; // Non funzionerà
?>

Questo non dovrebbe produrre una "A" maiuscola: \x41

Ha bevuto del succo di mela. Ha bevuto del succo d'arancia. Ha bevuto del succo di viola. John Smith ha bevuto del succo di mela. John Smith ha poi salutato Jane Smith. La moglie di John Smith ha salutato Robert Paulsen Robert Paulsen ha salutato i due.

Per qualcosa di più complesso, usa la sintassi complessa.

Sintassi complessa (riccia).

Si chiama complesso non perché sia ​​difficile da comprendere, ma perché consente l'uso di espressioni complesse.

Qualsiasi variabile scalare, elemento di array o proprietà di oggetto mappata su una stringa può essere rappresentata in una stringa utilizzando questa sintassi. { E } Scrivi semplicemente l'espressione nello stesso modo in cui faresti fuori dalla riga e poi avvolgila { . $ Perché { non è possibile eseguire l'escape, questa sintassi verrà riconosciuta solo quando {\$ segue direttamente {$ . Utilizzo

stampare
.

Alcuni esempi illustrativi:

// Mostra tutti gli errori
segnalazione_errori(E_ALL);

$grande = "grande";
// Non funziona, restituisce: Questo è (fantastico)
echo "Questo è ($fantastico)";

// Funziona, risultati: fantastico
\N echo "Questo è ($fantastico)"; echo "Questo è $(fantastico)";

// Funziona
"Questa piazza è ampia

// Funziona, risultati: fantastico
( $quadrato -> larghezza ) 00 centimetri." ;

// Funziona, le parole chiave tra virgolette funzionano solo con la sintassi delle parentesi graffe
echo "Funziona: ( $arr ["chiave"]) ";
echo "Funziona: ( $arr [ 4 ][ 3 ]) " ;
// Questo non è valido per lo stesso motivo di $foo outside
\N // linee. In altre parole, funzionerà ancora,// ma poiché PHP cerca prima la costante foo, ciò causerà

// errore di livello E_NOTICE (costante non definita).
"Questo è sbagliato:
($arr [foo] [3]) ";

// Funziona. Quando si utilizzano array multidimensionali internamente
// le righe utilizzano sempre le parentesi graffe

\N echo "Funziona: ( $arr [ "foo" ][ 3 ]) " ;// Funziona.

\N echo "Funziona: " . $arr [ "pippo" ][ 3];"Funziona anche questo:

\N ( $oggetto -> valori [ 3 ]-> nome ) " ;($( getNome ())) " ;

\N "Questo è il valore della variabile per nome che \$object->getName() restituisce:($( $oggetto -> getName ())) " ;

// Non funziona, restituisce: Questo è ciò che restituisce getName(): (getName())
\N "Questo è ciò che getName() restituisce: (getName())";
?>

È anche possibile accedere alle proprietà dell'oggetto all'interno delle stringhe utilizzando questa sintassi.

Esempio n. 1 Esempio sbagliato
var $bar = "Io sono bar." ;
}

$questo -> foo = "Foo";
$barra = "barra";
$baz = array("foo" , "bar" , "baz" , "quux" );
echo "($foo -> $bar)\n";
echo "( $foo -> $baz [ 1 ]) \n" ;
?>

Questo non dovrebbe produrre una "A" maiuscola: \x41

Sono bar. Sono bar.

Il mio nome è "$nome". Stampo $foo->foo. Ora stampo ($foo->bar). Questo non dovrebbe produrre una "A" maiuscola: \x41:

Le funzioni, le chiamate ai metodi, le variabili di classe statiche e le costanti di classe funzionano internamente {$} , a partire da PHP 5. Tuttavia, il valore fornito verrà trattato come un nome di variabile nello stesso contesto della riga in cui è definito. {} Utilizzando le parentesi graffe singole (

stampare
.

) non funzionerà per accedere ai valori di funzioni, metodi, costanti di classe o variabili di classe statiche.
birre di classe (
const bibita = "rootbeer";
}

pubblico statico $ale = "ipa";
$rootbirra = "A & W";

$ipa = "Alexander Keith";
// Funziona, output: vorrei A&W

echo "Vorrei ($( birre :: bibite )) \n" ;
// Anche questo funziona, risultati: vorrei quello di Alexander Keith
?>

echo "Vorrei ($( birre :: $ale )) \n" ;

Accesso e modifica di un carattere in una stringa I caratteri nelle stringhe possono essere utilizzati e modificati specificando il loro offset dall'inizio della stringa, iniziando con zero, tra parentesi quadre dopo la stringa, ad esempio $str . E Pensa a una stringa per questo scopo come a un array di caratteri..

Il mio nome è "$nome". Stampo $foo->foo. Ora stampo ($foo->bar). Questo non dovrebbe produrre una "A" maiuscola: \x41: Se devi ottenere o sostituire più di 1 carattere, puoi utilizzare le funzioni

Attenzione

sottostr() substr_replace()È possibile accedere a un carattere in una stringa anche utilizzando le parentesi graffe, ad esempio $str(42) . substr_replace() Il tentativo di scrivere su un offset oltre i limiti della riga riempirà la stringa con spazi fino a quell'offset. I tipi non interi verranno convertiti in tipi interi.

Attenzione

Il tipo di offset errato causerà un errore di livello

E_AVVISO

.
La scrittura su un offset negativo causerà un errore di livello
e una volta letto restituirà una stringa vuota.

// Ottiene il terzo carattere della stringa
$terzo = $str[2];

// Ottiene l'ultimo carattere della stringa
$str = "Questo è ancora un test." ;
$ultimo = $str [strlen ($str) - 1];

// Cambia l'ultimo carattere della riga
$str = "Guarda il mare";
$str [strlen ($str)- 1] = "e";

?>

A partire da PHP 5.4, l'offset nella stringa deve essere specificato come numero intero o come stringa contenente cifre, altrimenti verrà emesso un avviso. Offset precedentemente dato da una stringa like "pippo", senza preavviso è stato trasformato in 0 .

Esempio n. 10 Differenze tra PHP 5.3 e PHP 5.4

$str = "abc";

Var_dump($str["1"]);
var_dump (isset($str [ "1" ]));

Var_dump($str["1.0"]);
var_dump (isset($str ["1.0"]));

Var_dump($str["x"]);
var_dump (isset($str ["x"]));

Var_dump($str["1x"]);
var_dump (isset($str ["1x"]));
?>

Il risultato dell'esecuzione di questo esempio in PHP 5.3:

string(1) "b" bool(vero) string(1) "b" bool(vero) string(1) "a" bool(vero) string(1) "b" bool(vero)

Il risultato dell'esecuzione di questo esempio in PHP 5.4:

string(1) "b" bool(true) Avviso: offset stringa illegale "1.0" in /tmp/t.php alla riga 7 string(1) "b" bool(false) Avviso: offset stringa illegale "x" in / tmp/t.php alla riga 9 string(1) "a" bool(falso) string(1) "b" bool(falso)

Il mio nome è "$nome". Stampo $foo->foo. Ora stampo ($foo->bar). Questo non dovrebbe produrre una "A" maiuscola: \x41:

Tentativo di accedere a variabili di altri tipi (esclusi array o oggetti che implementano determinate interfacce) utilizzando O {} ritornerà silenziosamente NULL.

Il mio nome è "$nome". Stampo $foo->foo. Ora stampo ($foo->bar). Questo non dovrebbe produrre una "A" maiuscola: \x41:

PHP 5.5 ha aggiunto il supporto per l'accesso ai caratteri nelle stringhe letterali utilizzando la sintassi Tutti gli altri usi delle barre rovesciate verranno interpretati come caratteri normali: questo significa che se provi a utilizzare altre sequenze di escape come {} .

Esistono molte funzioni utili per modificare le stringhe.

Le funzioni di base sono descritte nella sezione sulle funzioni di stringa e per la ricerca e sostituzione avanzata, le espressioni regolari o le funzioni di espressione regolare compatibili con Perl.

Converti in stringa

Il valore può essere convertito in una stringa utilizzando un cast (corda) o funzioni valore_str(). \N O Nelle espressioni in cui è richiesta una stringa, la conversione avviene automaticamente. Ciò accade quando si utilizzano le funzioni stampa.

o quando il valore di una variabile viene confrontato con una stringa. La lettura delle sezioni Tipi e Manipolazione del tipo del manuale renderà più chiaro quanto segue. Vedi anche settype() Gli array vengono sempre convertiti in stringhe Esistono due tipi di sintassi: semplice e complessa."Vettore" \N Tutti gli altri usi delle barre rovesciate verranno interpretati come caratteri normali: questo significa che se provi a utilizzare altre sequenze di escape come Nelle espressioni in cui è richiesta una stringa, la conversione avviene automaticamente., quindi non è possibile visualizzare il contenuto dell'array ( ), utilizzando per vedere cosa contiene. Per visualizzare un singolo elemento, usa qualcosa di simile

echo $arr["pippo"] . Vedi sotto per suggerimenti su come visualizzare/visualizzare tutti i contenuti.. vettore Se vuoi visualizzare i valori dei campi di un oggetto ( ) a scopo di debug, continua a leggere. Se vuoi ottenere il nome della classe dell'oggetto richiesto, usa get_class()

NULL. A partire da PHP 5 è disponibile anche il metodo __toString.

viene sempre convertito nella stringa vuota. Come puoi vedere sopra, la conversione diretta di array, oggetti o risorse in una stringa non fornisce alcuna informazione utile sui valori stessi oltre ai loro tipi. E Un modo migliore per generare valori per il debug è utilizzare le funzioni.

stampa_r() var_dump() La maggior parte dei valori in PHP può essere convertita in una stringa per l'archiviazione persistente. Questo metodo è chiamato serializzazione e può essere eseguito utilizzando la funzione

serializzare()

. Inoltre, se la tua installazione PHP ha il supporto WDDX, è possibile anche la serializzazione su una struttura XML.

Conversione di stringhe in numeri Se la stringa viene riconosciuta come valore numerico, il valore e il tipo risultanti vengono determinati come segue. Se la stringa non contiene nessuno dei caratteri ".", "e" o "E", e il valore del numero rientra nei limiti dei numeri interi (definiti PHP_INT_MAX), la stringa verrà riconosciuta come intero ( intero).

).

In tutti gli altri casi è considerato un numero in virgola mobile ( galleggiante
Il valore è determinato dall'inizio della stringa. Se la riga inizia con un valore numerico valido, verrà utilizzato quel valore. Altrimenti il ​​valore sarà 0 (zero). Un valore numerico valido è costituito da una o più cifre (che possono contenere un punto decimale), facoltativamente precedute da un segno, seguito da un esponente facoltativo. L'esponente è "e" o "E" seguito da una o più cifre. $pippo = 1 + "10,5" ;
// $foo è un float (11.5)
$pippo = 1 + "-1.3e3" ;
// $foo è un float (-1299) $pippo = 1 + "bob-1.3e3" ; // $foo è un numero intero (1)
$pippo = 1 + "bob3" ; // $foo è un numero intero (1) $foo = 1 + "10 maialini";
// $foo è un numero intero (11)
$foo = 4 + "10.2 Porcellini";
?>

// $foo è un float (14.2)

$foo = "10.0 maiali" + 1; // $foo è float (11)

$foo = "10.0 maiali" + 1.0; // $foo è float (11)
Per ulteriori informazioni su questa conversione, vedere la sezione su strtod(3) nella documentazione Unix.
?>

Non aspettatevi di ottenere il codice di un carattere convertendolo in un numero intero (come avviene, ad esempio, in C). Per convertire i caratteri nei rispettivi codici ASCII e viceversa, utilizzare le funzioni ordine() E chr().

Dettagli di implementazione del tipo di stringa

Tipo di stringa ( corda) in PHP è implementato come un array di byte e un numero intero contenente la lunghezza del buffer. Non contiene alcuna informazione su come convertire questi byte in caratteri, lasciando questo compito al programmatore. Non esistono restrizioni sul contenuto di una stringa, ad esempio un byte con un valore 0 (byte "NUL") può essere posizionato ovunque (attenzione però che alcune funzioni, come indicato in questo manuale, non sono "binary safe", ovvero possono passare stringhe a librerie che ignorano i dati dopo NUL -byte).

Questa natura del tipo stringa spiega perché PHP non ha un tipo “byte” separato: le stringhe svolgono questo ruolo. Le funzioni che restituiscono dati non di testo, ad esempio un flusso di dati arbitrario letto da un socket di rete, restituiscono comunque stringhe.

Considerando il fatto che PHP non impone una codifica specifica per le stringhe, ci si potrebbe chiedere come vengono poi codificati i valori letterali delle stringhe. Ad esempio, la linea "á" equivalente "\xE1"(ISO-8859-1), "\xC3\xA1"(UTF-8, modulo di normalizzazione C), "\x61\xCC\x81"(UTF-8, modulo di normalizzazione D) o qualche altra possibile rappresentazione? La risposta è che la stringa verrà codificata nel modo in cui è scritta nel file di script. Pertanto, se lo script è scritto con la codifica ISO-8859-1, la stringa verrà codificata in ISO-8859-1, ecc. Tuttavia, questa regola non si applica quando è abilitata la modalità Zend Multibyte: in questo caso, lo script può essere scritto in qualsiasi codifica (specificata esplicitamente o determinata automaticamente), e poi convertito in una specifica codifica interna, che verrà successivamente utilizzata per stringhe letterali.

Naturalmente, per essere utili, le funzioni stringa devono fare alcune ipotesi sulla codifica della stringa. Sfortunatamente, tra le funzioni PHP esiste una varietà piuttosto ampia di approcci a questo problema:

  • Alcune funzioni presuppongono che la stringa sia codificata con una codifica a byte singolo, ma non è necessario che interpretino i byte come caratteri specifici per funzionare correttamente. I caratteri nelle stringhe possono essere utilizzati e modificati specificando il loro offset dall'inizio della stringa, iniziando con zero, tra parentesi quadre dopo la stringa, ad esempio $str ., In questa categoria rientrano, ad esempio,, strpos() strlen() E strcmp()
  • . Un altro modo di pensare a queste funzioni è che operano su buffer di memoria, ad es. lavorano direttamente con i byte e i loro offset.
  • compensazioni. Altre funzioni si aspettano che una codifica venga passata come parametro, magari assumendo una codifica predefinita se non è stato specificato un parametro con una codifica. Questa funzione è Infine, ci sono funzioni che presuppongono che una stringa utilizzi una codifica specifica, solitamente UTF-8. La maggior parte delle funzioni delle estensioni intl e PCRE rientrano qui (in quest'ultimo caso, solo quando si specifica il modificatore tu). Sebbene ciò sia fatto apposta, la funzione utf8_decode() implica la codifica UTF-8 e

codifica_utf8()

-ISO-8859-1.

In definitiva, scrivere programmi corretti che funzionino con Unicode significa evitare attentamente funzioni che non funzionano con Unicode e che potrebbero corrompere i dati, e utilizzare invece funzioni valide, solitamente dalle estensioni intl e mbstring.

Tuttavia, l'utilizzo di funzioni compatibili con Unicode è un buon inizio. Indipendentemente dalle funzionalità fornite da una lingua, è necessario conoscere le specifiche di Unicode stesso. Ad esempio, se un programma presuppone che in una lingua esistano solo lettere minuscole e maiuscole, commette un grosso errore.

Il motivo qui è semplice: l'interprete PHP controlla inoltre le stringhe tra virgolette doppie per la presenza di variabili e, se vengono trovate, al posto del nome della variabile, il suo valore viene inserito nella stringa. Ma una riga racchiusa tra apostrofi viene percepita dall'interprete come testo normale e PHP non effettua alcuna trasformazione in queste righe. Penso che sia chiaro che l’elaborazione delle stringhe tra virgolette singole sarà in ogni caso più veloce.

Innanzitutto, descriviamo come definire una stringa, quindi controlliamo quanto più veloce sarà elaborare le stringhe tra virgolette singole.

Il modo più semplice per definire una stringa è racchiuderla tra virgolette singole ("). Per utilizzare virgolette singole all'interno di una stringa con virgolette singole, devono essere precedute da una barra rovesciata (\), ovvero un carattere di escape. Se la barra rovesciata deve essere prima di una virgoletta singola o alla fine della riga, è necessario duplicarlo. Se si tenta di eseguire l'escape di qualsiasi altro carattere, verrà stampata anche la barra rovesciata.

Ecco un esempio di utilizzo delle virgolette singole:
// Risultato: stringa semplice
echo "Stringa semplice";
// Stampa: sono qui
echo "Sono qui";
// Output: questo non inserirà: \n una nuova riga
echo "Questo non inserirà:\nnewline";
// Risultati: neanche la variabile $example verrà sostituita
echo "Nemmeno la variabile $example verrà sostituita";

Se una stringa è racchiusa tra virgolette doppie ("), PHP riconosce più sequenze di escape per caratteri speciali e sostituisce anche il nome della variabile nella stringa con il suo valore. Proprio come con le virgolette singole, per utilizzare le virgolette doppie all'interno di una stringa racchiusa tra virgolette doppie, devono essere precedute da un carattere barra rovesciata (\).
// Risultato: stringa semplice
echo "Stringa semplice";
Ecco un esempio di utilizzo delle virgolette doppie:
// Risultati: Compagnia "Bucaneve"
echo "Azienda \"Bucaneve\"";
// Output: questo porterà a una nuova riga
echo "Questo verrà interrotto in una nuova riga\n";
// Output: la variabile verrà sostituita
$esempio = "verrà sostituito";

Scopriamo quanto sono più veloci le virgolette singole rispetto alle virgolette doppie. Per le misurazioni scriveremo un breve script di test e noteremo subito che se lo testate voi stessi, i risultati, che dipendono dall'hardware del vostro PC o server, saranno diversi.
// Restituisce il timestamp all'inizio del ciclo
$inizio = microtempo(true);
// Crea un ciclo per 1 milione di iterazioni
per ($i = 0; $i< 1000000; $i++) {
$testo = "Ecco una stringa di caratteri";
}
// Calcola il tempo impiegato
$tempo = (microtempo(true) - $inizio);

Risultato: 0,09 secondi.
Se sostituiamo le virgolette singole con virgolette doppie:

$testo = "Ecco una stringa di caratteri";
Il risultato sarà 0,10 secondi.
Come puoi vedere, quando si utilizzano stringhe di testo, la differenza nel tempo di esecuzione è molto piccola, si potrebbe addirittura dire che non esiste affatto. Il divertimento inizia quando proviamo a combinare una stringa e una variabile.

$testo = "Ecco la stringa di caratteri $i";

O

$testo = $i."Ecco una stringa di caratteri";

Risultato approssimativo: 0,27 secondi.

La differenza è abbastanza evidente. La concatenazione e le virgolette doppie influiscono chiaramente sulle prestazioni quando si aggiungono variabili alla stringa.

Pertanto, se dobbiamo visualizzare il testo "così com'è", utilizziamo le virgolette singole. Se devi sostituire il suo valore invece di una variabile, usa quelle doppie (se c'è solo una variabile, puoi omettere del tutto le virgolette). Spesso puoi vedere codice come questo:

Viene visualizzato solo il testo. Ma nel codice, per qualche motivo sconosciuto, è racchiuso tra virgolette doppie, costringendo l'interprete ad analizzarlo per la presenza di variabili. È corretto racchiudere il testo tra virgolette singole.

Consideriamo il compito banale di visualizzare una variabile come parte del testo, incluso l'utilizzo del codice html.

$data"; ?>

Tutto viene visualizzato bene, il testo e la data evidenziati in grassetto, che viene sostituito al posto della variabile. Ma devi ricordare due cose. Innanzitutto, questa è una caratteristica dell'interprete: la concatenazione delle stringhe è molto più veloce e richiede meno risorse rispetto all'analisi delle stringhe. E in secondo luogo, non dimenticare il paradigma di programmazione “divide et impera”. Non è necessario mescolare tutto in uno; sarebbe molto più corretto dividere il testo in due parti: quelle che richiedono e quelle che non richiedono l'analisi da parte dell'interprete. Quindi l'esempio sopra dovrebbe essere scritto in questo modo:

".$data.""; ?>

Naturalmente, devi seguire questa regola (racchiudere tutto ciò che non richiede l'analisi tra virgolette singole) non solo quando visualizzi il testo, ma anche quando assegni valori alle variabili stringa:

Oppure, ad esempio, quando si utilizzano stringhe per passare gli argomenti della funzione:

E anche se sui computer moderni il guadagno di tempo nell'interpretazione del codice a seconda dell'uso di virgolette singole o doppie sarà praticamente impercettibile, soprattutto in piccoli script, vale comunque la pena abituarsi a scrivere codice competente fin dall'inizio, è molto più facile che reimpararlo più tardi.