Diferența dintre ghilimele duble și simple în PHP. Care este diferența dintre șirurile ghilimele simple și duble în PHP? PHP ghilimele duble între ghilimele

Acasă / Instalarea dispozitivului

Comentariu: În PHP 7.0.0 pe platforme pe 64 de biți, nu există limite posibile pentru lungimea liniei pe sistemele pe 32 de biți, iar în versiunile anterioare de PHP, liniile nu pot fi mai mari de 2 GB (2147483647 octeți);

Sintaxă

Un șir poate fi definit cu patru în diverse moduri:

  • ghilimele simple
  • ghilimele duble
  • sintaxa nowdoc (din PHP 5.3.0)

Ghilimele simple

Cel mai simplu mod a defini un șir înseamnă a-l încadra între ghilimele simple (caracter " ).

Pentru a utiliza un singur ghilimele într-un șir, evadați-l cu o bară oblică inversă ( \ ). Dacă trebuie să scrieți bara oblică inversă, duplicați-o ( \\ ). Toate celelalte utilizări ale barei oblice inverse vor fi interpretate ca caractere normale: aceasta înseamnă că dacă încercați să utilizați alte secvențe de escape, cum ar fi \r sau \n, vor fi scoase ca atare în loc de orice comportament special.

ecou „acesta este un șir simplu”;

ecou „De asemenea, puteți introduce în rânduri
personaj newline ca acesta,
Asta e bine"
;

// Ieșiri: Arnold a spus odată: „Mă întorc”
ecou „Într-o zi, Arnold a spus: „Mă întorc”.;

Ecou „Ați șters C:\\*.*?”;

// Ieșiri: Ați șters C:\*.*?
echo "Ați șters C:\.*.*?" ;

// Ieșiri: Aceasta nu va fi extinsă: \n linie nouă
ecou „Acest lucru nu va fi extins: \n linie nouă”;

// Ieșiri: variabilele $expand și $fither nu sunt extinse
ecou „$expand și $fither variabilele nu sunt extinse”;
?>

Ghilimele duble

Dacă șirul este cuprins între ghilimele duble ("), PHP recunoaște următoarele secvențe de escape de caractere speciale:

Secvențe de evacuare
Urmare Sens
\n linie nouă (LF sau 0x0A (10) în ASCII)
\r retur transport (CR sau 0x0D (13) în ASCII)
\t filă orizontală (HT sau 0x09 (9) în ASCII)
\v filă verticală (VT sau 0x0B (11) în ASCII) (din PHP 5.2.5)
\e caracter de escape (ESC sau 0x1B (27) în ASCII) (din PHP 5.4.4)
\f flux de pagină (FF sau 0x0C(12) în ASCII) (din PHP 5.2.5)
\\ backslash
\$ semnul dolarului
\" ghilimele duble
\{1,3} o secvență de caractere care se potrivește cu o expresie regulată a unui caracter octal care se revarsă în tăcere pentru a se potrivi într-un octet (adică „\400” === „\000”)
\x(1,2) succesiune de caractere corespunzătoare expresiei regulate a unui caracter în notație hexazecimală
\u(+) o secvență de caractere care se potrivește cu o expresie regulată de caracter Unicode care se mapează la un șir în reprezentare UTF-8 (adăugat în PHP 7.0.0)

Ca și în cazul unui șir cuprins între ghilimele simple, evadarea oricărui caracter va scoate, de asemenea, caracterul de evacuare în sine. Înainte de PHP 5.1.1, bara oblică inversă \($var) nu a fost publicat.

Heredoc

A treia modalitate de a defini șiruri este de a folosi sintaxa heredoc: <<< . După acest operator, trebuie să specificați un identificator, apoi un avans de linie. După aceasta urmează linia în sine, și apoi același identificator, închidend inserția.

Linia ar trebuiîncepe cu un identificator de închidere, adică trebuie să apară în prima coloană a rândului. În plus, identificatorul trebuie să urmeze aceleași reguli de denumire ca toate celelalte etichete din PHP: să conțină doar caractere alfanumerice și un caracter de subliniere și nu trebuie să înceapă cu un număr (sunt permise caractere de subliniere).

Atenţie

Este foarte important de reținut că linia de identificare de închidere nu trebuie să conțină alte caractere, cu excepția punctului și virgulă ( ; ). Aceasta înseamnă că id nu trebuie indentatăși că nu pot exista spații sau file înainte sau după punct și virgulă. De asemenea, este important să înțelegeți că primul caracter înainte de identificatorul de închidere trebuie să fie un caracter de linie nouă, așa cum este definit de sistemul dvs. de operare. De exemplu, pe sisteme UNIX, inclusiv macOS, aceasta este \n. După identificatorul de închidere, o nouă linie trebuie să înceapă imediat.

Dacă această regulă este încălcată și identificatorul de închidere nu este „curat”, identificatorul de închidere este considerat lipsă și PHP va continua să-l caute în continuare. Dacă în acest caz nu se găsește niciodată identificatorul de închidere corect, va cauza o eroare de analiză cu numărul liniei de la sfârșitul scriptului.

Exemplul #1 Exemplu de sintaxă incorectă

clasa foo (
public $bar =<<bar
EOT;
// indentarea înainte de identificatorul de închidere nu este permisă
}
?>

Exemplul #2 Exemplu de sintaxă corectă

clasa foo (
public $bar =<<bar
EOT;
}
?>

Heredoc nu poate fi folosit pentru a inițializa câmpurile de clasă.

Textul Heredoc se comportă la fel ca un șir între ghilimele duble, fără a le avea.

Aceasta înseamnă că nu trebuie să evadați ghilimele din heredoc, dar puteți utiliza în continuare secvențele de escape de mai sus.

Variabilele sunt procesate, dar trebuie să fiți la fel de atenți atunci când utilizați variabile complexe în heredoc ca și atunci când lucrați cu șiruri.<<Exemplul #3 Exemplu de definiție de șir Heredoc
$str =
Linie de exemplu,
care se întinde pe mai multe linii,

folosind sintaxa heredoc.
{
EOD;
Clasa foo

var $foo ;
{
var $bar ;
Function__construct()
}
}

$this -> foo = "Foo" ;
$acest ->

$foo = new foo();<<$name = "Nume" ; .
ecou
Numele meu este "$name". Tastesc $foo -> foo .
Acum deduc
EOT;
?>

( $foo -> bar [ 1 ])

Aceasta ar trebui să scoată litera majusculă „A”: \x41

Numele meu este "Nume". Tastesc Foo. Acum, scot Bar2. Aceasta ar trebui să scoată o literă majusculă „A”: A

De asemenea, este posibil să utilizați sintaxa heredoc pentru a trece date prin argumentele funcției:

De la versiunea 5.3.0, a devenit posibilă inițializarea variabilelor statice și proprietățile/constantele clasei folosind sintaxa heredoc:
Exemplul #5 Utilizarea heredoc pentru a inițializa variabile statice
{
// Variabile statice<<funcția foo()
static $bar =
}

Nu e nimic aici...
ETICHETA;
{
// Constante/proprietăți ale clasei<<clasa foo
const BAR =

Exemplu de utilizare a unei constante<<FOOBAR;
const BAR =
}
?>

Public $baz =

Exemplu de utilizare a unui câmp

Începând cu PHP 5.3.0, puteți, de asemenea, să înconjurați identificatorul Heredoc cu ghilimele duble: Nowdoc Nowdoc este același pentru șirurile cu ghilimele simple ca și heredoc pentru șirurile cu ghilimele duble. Nowdoc este similar cu heredoc, dar în interiorul lui nu se fac înlocuiri

. Acest design este ideal pentru încorporarea codului PHP sau a altor blocuri mari de text fără a fi nevoie să scape de el. În acest sens, este puțin similar cu constructul SGML <<< prin declararea unui bloc de text care nu este destinat a fi procesat. <<<"EOT" Nowdoc este indicat prin aceeași secvență

, care este folosit în heredoc, dar următorul identificator este inclus între ghilimele simple, de exemplu,

$foo = new foo();<<<"EOD"
.
Toate condițiile care se aplică pentru identificatorii heredoc se aplică și pentru nowdoc, în special cele care se aplică pentru identificatorul de închidere.
Exemplul #7 Exemplu de utilizare a nowdoc
Exemplu de text,
care se întinde pe mai multe rânduri

folosind sintaxa nowdoc. Backslash-urile sunt întotdeauna tratate literalmente,

Exemplu de text care se întinde pe mai multe linii folosind sintaxa nowdoc. Barele oblice inverse sunt întotdeauna tratate literal, cum ar fi \\ și \".

Exemplul #8 Exemplu de citare a șirului Nowdoc cu variabile

/* Exemplu mai complex cu variabile. */
ETICHETA;
{
public $foo ;
public $bar ;

var $foo ;
{
var $bar ;
$this -> bar = array("Bar1" , "Bar2" , "Bar3" );
}
}

$this -> foo = "Foo" ;
$acest ->

$foo = new foo();<<<"EOT"
Numele meu este "$name". Tipăresc $foo->foo.
Acum printez ($foo->bar).
Aceasta nu ar trebui să scoată un „A” majuscul: \x41
EOT;
?>

folosind sintaxa nowdoc. Backslash-urile sunt întotdeauna tratate literalmente,

Numele meu este "$name". Tipăresc $foo->foo. Acum printez ($foo->bar). Aceasta nu ar trebui să scoată un „A” majuscul: \x41

Exemplul #9 Exemplu de utilizare a datelor statice

clasa foo (
public $bar =<<<"EOT"
bar
EOT;
}
?>

Comentariu:

Suportul nowdoc a fost adăugat în PHP 5.3.0.

Manipularea variabilelor

Dacă un șir este specificat între ghilimele duble sau folosind heredoc, variabilele din interiorul acestuia sunt procesate.

Există două tipuri de sintaxă: simplă și complexă. Sintaxa simplă este mai ușoară și mai convenabilă. Face posibilă procesarea unei variabile, a unei valori de matrice ( matrice ) sau proprietățile obiectului ( obiect

) cu un minim de efort.

Sintaxa complexă poate fi identificată prin acoladele care înconjoară expresia.

Sintaxă simplă $ Dacă interpretul întâlnește un semn dolar (

), captează cât mai multe caractere pentru a forma numele corect al variabilei. Dacă doriți să specificați sfârșitul unui nume, includeți numele variabilei între acolade.

$suc = „măr” ;

echo "A băut niște $suc". . PHP_EOL ;
// Incorect. „s” este un caracter valid pentru un nume de variabilă, dar variabila se numește $juice.

echo „A băut niște suc făcut din $sucuri”. ;
// Corect. Sfârșitul numelui variabilei este strict indicat folosind paranteze:
?>

folosind sintaxa nowdoc. Backslash-urile sunt întotdeauna tratate literalmente,

echo "A băut niște suc făcut din $( juice ) s." ;

A băut niște suc de mere. A băut niște suc făcut din . A băut niște suc făcut din mere. Sintaxa simplă este mai ușoară și mai convenabilă. Face posibilă procesarea unei variabile, a unei valori de matrice ( Un element de matrice ( ) sau proprietățile obiectului () sau proprietatea obiectului ( ] ). În indicii de matrice există o paranteză pătrată de închidere (

) marchează sfârșitul definiției indexului. Aceleași reguli se aplică proprietăților obiectului ca și variabilelor simple.

Exemplul #10 Exemplu de sintaxă simplă
definesc ("KOOLAID", "koolaid1");

$sucuri = array("măr" , "orange" , "koolaid1" => "violet" );
echo "A băut niște $juices [ 0 ] juice." . PHP_EOL ;
echo "A băut niște $sucuri [ 1 ] suc." . PHP_EOL ;

echo "A băut niște $juices [ koolaid1 ] juice." . PHP_EOL ;
oameni de clasa (
public $john = "John Smith" ;
public $jane = "Jane Smith" ;

public $robert = "Robert Paulsen" ;
}

Public $smith = "Smith" ;

echo "$oameni -> john a băut niște $sucuri [ 0 ] suc." . PHP_EOL ;
echo " $people -> John apoi i-a salutat pe $people -> jane ." . PHP_EOL ;
echo "$people -> soția lui John a salutat $people -> robert." . PHP_EOL;
echo " $people -> robert ia salutat pe cei doi $people -> smiths ." ; // Nu va funcționa
?>

folosind sintaxa nowdoc. Backslash-urile sunt întotdeauna tratate literalmente,

A băut niște suc de mere. A băut niște suc de portocale. A băut niște suc violet. John Smith a băut niște suc de mere. John Smith a salutat-o ​​apoi pe Jane Smith. Soția lui John Smith i-a salutat pe Robert Paulsen.

PHP 7.1.0 a adăugat suport negativ indici numerici.

Exemplul #11 Indici numerici negativi

$șir = "șir" ;
ecou „Personajul de la indicele -2 este egal cu$șir [- 2 ] ." , PHP_EOL ;
$șir [- 3 ] = "o" ;
ecou „Schimbarea caracterului din poziția -3 în „o” produce următoarea linie:$șir." , PHP_EOL;
?>

folosind sintaxa nowdoc. Backslash-urile sunt întotdeauna tratate literalmente,

Caracterul cu indicele -2 este egal cu n. Schimbarea caracterului din poziția -3 în „o” dă următoarea linie: puternic

Pentru ceva mai complex, utilizați sintaxă complexă.

Sintaxă complexă (creț).

Se numește complex nu pentru că este greu de înțeles, ci pentru că permite utilizarea expresiilor complexe.

Orice variabilă scalară, element de matrice sau proprietate de obiect mapată la un șir poate fi reprezentată într-un șir folosind această sintaxă. Doar scrieți expresia în același mod în care ați face-o în afara liniei și apoi înfășurați-o { Şi } . Din moment ce { nu poate fi scăpată, această sintaxă va fi recunoscută numai când $ urmează direct { . Utilizare {\$ a imprima {$ .

Câteva exemple ilustrative:
// Afișează toate erorile

raportare_erori(E_ALL);

$mare = „mare” ;
// Nu funcționează, iese: Acesta este (super)

echo "Acesta este ( $ grozav )" ;
// Lucrări, ieșiri: Acest lucru este grozav

echo "Acesta este ( $ grozav ) " ;
ecou // Lucrări„Acest pătrat este lat

( $pătrat -> lățime ) 00 centimetri." ;
// Funcționează, cuvintele cheie citate funcționează numai cu sintaxa acolade

echo "Acesta este ( $ grozav ) " ;
echo "Acest lucru funcționează: ( $arr [ "cheie" ]) " ;

echo "Acest lucru funcționează: ( $arr [ 4 ][ 3 ]) " ;
// Acesta este invalid din același motiv ca $foo afară
// linii. Cu alte cuvinte, va funcționa în continuare,
// dar deoarece PHP caută mai întâi constanta foo, acest lucru va cauza
ecou // eroare de nivel E_NOTICE (constantă nedefinită).„Acest lucru este greșit:

( $arr [ foo ][ 3 ]) " ;
// Lucrări. Când se utilizează tablouri multidimensionale în interior
// liniile folosesc întotdeauna acolade

echo "Acest lucru funcționează: ( $arr [ "foo" ][ 3 ]) " ;
// Lucrări.

ecou echo "Acest lucru funcționează: " . $arr [ "foo" ][ 3 ];( $obj -> valori [ 3 ]-> nume ) " ;

ecou „Aceasta este valoarea variabilei numite$nume : ($( $nume )) " ;

ecou „Aceasta este valoarea numelui variabilei pe care getName() o returnează:($( getName ())) " ;

ecou „Aceasta este valoarea variabilei după nume pe care o returnează \$object->getName():($( $obiect -> getName ())) " ;

// Nu funcționează, iese: Iată ceea ce returnează getName(): (getName())
ecou „Aceasta este ceea ce returnează getName(): (getName())”;
?>

De asemenea, este posibil să accesați proprietățile obiectului din șiruri folosind această sintaxă.

clasa foo (
var $bar = "Sunt bar." ;
}

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

folosind sintaxa nowdoc. Backslash-urile sunt întotdeauna tratate literalmente,

Sunt bar. Sunt bar.

Comentariu:

Funcțiile, apelurile de metode, variabilele de clasă statice și constantele de clasă funcționează intern {$} , începând cu PHP 5. Cu toate acestea, valoarea furnizată va fi tratată ca un nume de variabilă în același context ca și linia în care este definită. Folosind bretele simple ( {} ) nu va funcționa pentru accesarea valorilor funcțiilor, metodelor, constantelor de clasă sau variabilelor de clasă statice.

Câteva exemple ilustrative:
// Afișează toate erorile

beri de clasa (
const softdrink = "rootbeer" ;
public static $ale = "ipa" ;
}

$rootbeer = "A & W" ;
$ipa = "Alexander Keith" ;

// Funcționează, iese: aș dori A & W
echo "Aș dori ($( bere :: băutură răcoritoare )) \n" ;

// Funcționează și asta, rezultă: aș dori cel al lui Alexander Keith
echo "Aș dori ($( bere :: $ale )) \n" ;
?>

Accesarea și modificarea unui caracter dintr-un șir

Caracterele din șiruri pot fi folosite și modificate prin specificarea decalajului lor de la începutul șirului, începând cu zero, între paranteze drepte după șir, de exemplu, $str . Gândiți-vă la un șir în acest scop ca la o matrice de caractere.Şi Dacă trebuie să obțineți sau să înlocuiți mai mult de 1 caracter, puteți utiliza funcțiile.

Comentariu: substr() substr_inlocuire()Începând cu PHP 7.1.0, sunt acceptate valorile de offset negative. Ele specifică decalajul de la sfârșitul liniei. Compensațiile negative anterior au provocat o eroare de nivel E_NOTIZARE

Comentariu: la citire (returnând un șir gol) sau

Atenţie

E_AVERTISMENT Ele specifică decalajul de la sfârșitul liniei. Compensațiile negative anterior au provocat o eroare de nivel.

Atenţie

Se folosește doar primul caracter al șirului atribuit.

Comentariu: Începând cu PHP 7.1.0, alocarea unui șir gol va cauza o eroare fatală. Anterior, în acest caz, a fost atribuit un octet zero (NULL).

Șirurile în PHP sunt matrice interne de octeți. Ca urmare, accesarea sau modificarea unui șir la un offset nu este sigură pentru codificarea pe mai mulți octeți și ar trebui făcută numai cu șiruri în codificări pe un singur octet, cum ar fi ISO-8859-1.

Deoarece PHP 7.1.0, utilizarea unui index gol provoacă o eroare fatală anterior, în acest caz, șirul a fost convertit într-o matrice fără avertisment.
Exemplul #12 Câteva exemple de șiruri
// Obține primul caracter al șirului

$str = "Acesta este un test." ;
$primul = $str [ 0 ];

// Obține al treilea caracter al șirului
$treia = $str [ 2 ];
// Obține ultimul caracter al șirului

$str = "Acesta este încă un test." ;
$ultimul = $str [ strlen ($str ) - 1 ];
// Schimbă ultimul caracter al liniei

?>

$str = „Uită-te la mare” ; $str [ strlen ($str )- 1 ] = "e" ;Începând cu PHP 5.4, offset-ul dintr-un șir trebuie specificat fie ca un întreg, fie ca șir care conține cifre, altfel va fi emis un avertisment. Offset anterior dat de un șir de tipul 0 .

"foo"

, fără avertisment a fost transformat în

Exemplul #13 Diferențele dintre PHP 5.3 și 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" ]));

Rezultatul rulării acestui exemplu în PHP 5.3:

șir(1) „b” bool(adevărat) șir(1) „b” bool(adevărat) șir(1) „a” bool(adevărat) șir(1) „b” bool(adevărat)

Comentariu:

Rezultatul rulării acestui exemplu în PHP 5.4: string(1) „b” bool(true) Avertisment: offset ilegal de șir „1.0” în /tmp/t.php pe linia 7 șir (1) „b” bool(false) Avertisment: offset ilegal de șir „x” în / tmp/t.php pe linia 9 șir(1) „a” bool(fals) șir(1) „b” bool(fals) {} Încercarea de a accesa variabile de alte tipuri (excluzând matricele sau obiectele care implementează anumite interfețe) folosind sau.

Comentariu:

se va întoarce în tăcere NUL {} .

PHP 5.5 a adăugat suport pentru accesarea caracterelor din literalele șir folosind sintaxa

sau

Există multe funcții utile pentru modificarea șirurilor.

Funcțiile de bază sunt descrise în secțiunea privind funcțiile șir, iar pentru căutare avansată și înlocuire, funcții de expresie regulată compatibile cu Perl. Convertiți în șir O valoare poate fi convertită într-un șir folosind un cast strval(). ecou string(1) „b” bool(true) Avertisment: offset ilegal de șir „1.0” în /tmp/t.php pe linia 7 șir (1) „b” bool(false) Avertisment: offset ilegal de șir „x” în / tmp/t.php pe linia 9 șir(1) „a” bool(fals) șir(1) „b” bool(fals) În expresiile în care este necesar un șir, conversia are loc automat. Acest lucru se întâmplă atunci când utilizați funcții imprimare.

, sau când valoarea unei variabile este comparată cu un șir. Citirea secțiunilor Tipuri și Manipulare tip din manual va clarifica următoarele. Vezi de asemenea settype() Matricele sunt întotdeauna convertite în șir Sintaxa simplă este mai ușoară și mai convenabilă. Face posibilă procesarea unei variabile, a unei valori de matrice („Matrice” ecou NUL În expresiile în care este necesar un șir, conversia are loc automat., deci nu puteți afișa conținutul matricei ( ), folosind sa vezi ce contine. Pentru a vizualiza un singur element, utilizați ceva de genul

echo $arr[„foo”] . Consultați mai jos sfaturi despre cum să afișați/vizualizați tot conținutul. Pentru a converti o variabilă de tip "Obiect"în tip

şir sau Este folosită metoda magică __toString.

Sens este întotdeauna convertit în șirul gol.Şi După cum puteți vedea mai sus, conversia directă a matricelor, obiectelor sau resurselor într-un șir de caractere nu oferă informații utile despre valorile înseși, în afară de tipurile lor..

O modalitate mai bună de a afișa valori pentru depanare este utilizarea funcțiilor print_r().

var_dump()

Majoritatea valorilor din PHP pot fi convertite într-un șir pentru stocare persistentă. Această metodă se numește serializare și poate fi realizată folosind funcția

serializa() Conversia șirurilor în numere Dacă șirul este recunoscut ca valoare numerică, valoarea și tipul rezultat sunt determinate după cum urmează. Dacă șirul nu conține niciunul dintre caracterele „.”, „e”, sau „E”, iar valoarea numărului se încadrează în limitele numerelor întregi (definite PHP_INT_MAX ), șirul va fi recunoscut ca un număr întreg ().

întreg

). În toate celelalte cazuri, este considerat un număr în virgulă mobilă (
plutesc Valoarea este determinată de începutul șirului. Dacă linia începe cu o valoare numerică validă, acea valoare va fi utilizată. În caz contrar, valoarea va fi 0 (zero). O valoare numerică validă este una sau mai multe cifre (care pot conține un punct zecimal), precedată opțional de un semn urmat de un exponent opțional. Exponentul este „e” sau „E” urmat de una sau mai multe cifre.
$foo = 1 + "10,5" ;
// $foo este un float (11.5)
$foo = 1 + "-1.3e3" ; // $foo este un float (-1299)
$foo = 1 + "bob-1.3e3" ; // $foo este un număr întreg (1) $foo = 1 + "bob3" ; // $foo este un număr întreg (1)
$foo = 1 + „10 porci mici” ;
// $foo este un număr întreg (11)
?>

Pentru mai multe informații despre această conversie, consultați secțiunea despre strtod(3) din documentația Unix.

Dacă doriți să testați oricare dintre exemplele din această secțiune, copiați-l și lipiți-l și următoarea linie pentru a vedea ce se întâmplă:

echo "\$foo== $foo ; tip: " . gettype ($foo) . "
\n" ;
?>

Nu vă așteptați să obțineți codul unui caracter transformându-l într-un număr întreg (cum se face, de exemplu, în C). Pentru a converti caracterele în codurile lor ASCII și înapoi, utilizați funcțiile ord()Şi chr().

Detalii de implementare tip șir

acum 7 ani

Documentația nu menționează, dar un punct și virgulă de închidere la sfârșitul heredocului este de fapt interpretat ca un punct și virgulă real și, ca atare, duce uneori la erori de sintaxă.

$foo =<<abcd
SFÂRŞIT;
?>

Aceasta nu înseamnă:

foo(<<abcd
SFÂRŞIT;
);
// eroare de sintaxă, ";" neașteptată
?>

Fără punct și virgulă, funcționează bine:

foo(<<abcd
Sfârşit
);
?>

acum 3 ani

Puteți folosi șir ca și matrice de caractere (cum ar fi C)

$a = "Test matrice de șiruri";

var_dump($a);
// Returnează șirul (17) „Test matrice de șiruri”

var_dump($a);
// Returnează șirul(1) „S”

// -- Cu turnare matrice --
var_dump((matrice) $a);
// Returnează matrice (1) ( => șir (17) „Test matrice de șiruri”)

var_dump((matrice) $a);
// Returnează șirul (17) „S”

Norihiori

acum 15 ani

Puteți utiliza sintaxa complexă pentru a pune valoarea ambelor proprietăți ale obiectului ȘI metodelor obiectului într-un șir. De exemplu...
test de clasa(
public $one = 1 ;
funcția publică doi() (
întoarcere 2;
}
}
$test = test nou();
echo "foo ( $test -> unu ) bar ( $test -> doi ()) " ;
?>
Va scoate „foo 1 bar 2”.

Cu toate acestea, nu puteți face acest lucru pentru toate valorile din spațiul dvs. de nume. Constantele clasei și proprietățile/metodele statice nu vor funcționa deoarece sintaxa complexă caută „$”.
test de clasa(
const ONE = 1 ;
}
echo "foo (Test::ONE) bar";
?>
Aceasta va afișa „foo (Test::one) bar”. Constantele și proprietățile statice vă cer să rupeți șirul.

acum 3 ani

Atenție că în concordanță cu „Conversia șirurilor în numere”:

Dacă ("123abc" == 123 ) ecou „(intstr == int) testează incorect ca adevărat.”;

// Deoarece o parte este un număr, șirul este convertit incorect din intstr în int, care apoi se potrivește cu numărul de test.

// Adevărat pentru toate condițiile, cum ar fi instrucțiunile if și switch (probabil și buclele while)!

// Acesta ar putea fi un risc uriaș de securitate la testarea/utilizarea/salvarea intrărilor utilizatorului, în timp ce așteptați și testați doar un număr întreg.

// Se pare că singura remediere este ca 123 să fie un șir ca „123”, așa că nu are loc nicio conversie.

?>

acum 6 ani

Zerourile inițiale din șiruri sunt (cel mai puțin surpriză) nu sunt tratate ca octale.
Luați în considerare:
$x = "0123" + 0;
$y = 0123 + 0;
echo "x este $x, y este $y"; //afișează „x este 123, y este 83”
cu alte cuvinte:
* zerourile de început în literalele numerice din codul sursă sunt interpretate ca „octal”, c.f. strtol().
* zerourile de început în șiruri de caractere (de exemplu, datele trimise de utilizator), atunci când sunt transformate (implicit sau explicit) în numere întregi, sunt ignorate și considerate zecimale, c.f. strtod().

acum 10 ani

Iată un truc ușor pentru a permite ca șirurile de caractere duble și heredoc-urile să conțină expresii arbitrare în sintaxa acoladelor, inclusiv constante și alte apeluri de funcție:

// Declarație de hack
funcția _expr ($v ) ( returnează $v ; )
$_expr = "_expr" ;

// Locul nostru de joacă
define("qwe" , "asd");
defini("zxc", 5 );

$a= 3 ;
$b= 4 ;

funcţie c($a, $b) (întoarcerea$a+ $b; }

//Utilizare
ecou„pre{ $_expr(1 + 2 )} postare\n"; // iese „pre 3 post”
ecou„pre{ $_expr(qwe)} postare\n"; // iese „pre post asd”
ecou„pre{ $_expr(c($a, $b)+ zxc* 2 )} postare\n"; // scoate „post înainte de 17”

// Sintaxa generală este ($_expr(...))
?>

acum 2 ani

Am crezut că ar fi util să adaug acest comentariu, astfel încât informațiile să apară măcar pe pagina potrivită a site-ului PHP.

Rețineți că, dacă intenționați să utilizați un șir de ghilimele duble cu o cheie asociativă, puteți întâlni eroarea T_ENCAPSED_AND_WHITESPACE. Unii consideră că acesta este unul dintre mesajele de eroare mai puțin evidente.

O expresie precum:

$fructe=matrice(
"o"=> "măr",
"b"=> "banană",
//etc
);

Imprimare „Acesta este un$fructe[ "o"]"; // T_ENCAPSED_AND_WHITESPACE
?>

va cădea cu siguranță în bucăți.

O poți rezolva după cum urmează:

În expresiile în care este necesar un șir, conversia are loc automat.„Acesta este un$fructe[ o] " ; // decuplați cheia
În expresiile în care este necesar un șir, conversia are loc automat.„Acesta este un${ fructe[ "o"]} " ; // Sintaxă complexă
În expresiile în care este necesar un șir, conversia are loc automat.„Acesta este un{ $fructe[ "o"]} " ; // Variație complexă a sintaxei
?>

Am o preferință personală pentru ultima variație, deoarece este mai naturală și mai aproape de cum ar fi expresia în afara șirului.

Nu este clar (cel puțin pentru mine) de ce PHP interpretează greșit ghilimelele din interiorul expresiei, dar îmi imaginez că are ceva de-a face cu faptul că ghilimelele nu fac parte din șirul de valoare - odată ce șirul este deja analizat, ghilimelele doar pune in cale...?

acum 2 ani

Ambele ar trebui să funcționeze:(

clasăTestare{
static public
$VAR= "static";
public const VAR =
"const";

Funcția publică spuneBună ziua Static() {
ecou
"Buna ziua:{ $aceasta:: $VAR} " ;
}

Funcția publică sayHelloConst() {
ecou
"Buna ziua:{ $aceasta::VAR)" ; //Eroare de analiză: eroare de sintaxă, neașteptată „)”, așteptând „[”
}
}

$obj= nouTestare();
$obj-> spuneBună ziua Static();
$obj-> sayHelloConst();

acum 3 ani

Ceva pe care l-am experimentat și care fără îndoială va ajuta pe cineva. . .
În editorul meu, aceasta va evidenția sintaxa HTML și comentariul $:

$html =<<<"EOD"
$comentare
EOD;

Folosind aceasta, toate arată aceeași culoare:

$html =<<$comentare
EOD;

făcând mult mai ușor să lucrezi

acum 11 ani

Pentru a-ți salva mintea, nu citi comentariile anterioare despre date ;)

Când ambele șiruri pot fi convertite în cifre (în testul ("$a" > "$b")), atunci cifrele rezultate sunt utilizate, altfel șirurile COMPLETE sunt comparate caracter cu caracter:

var_dump("1.22" > "01.23" ); // bool(fals)
var_dump("1.22.00" > "01.23.00" ); //bool(adevărat)
var_dump("1-22-00" > "01-23-00" ); //bool(adevărat)
var_dump((plutește)"1.22.00" > (plutitor)"01.23.00" ); // bool(fals)
?>

Șirurile în PHP sunt înconjurate de ghilimele simple sau duble. Principala diferență este că puteți pune o variabilă între ghilimele duble:

Acum putem veni cu o altă soluție la problema din lecția Variabile în PHP:

$titlu"; ecou"

$conținut
"; ?>

Cum găsește PHP o variabilă într-un șir?

Este simplu. Vă amintiți ce caractere pot fi folosite într-un nume de variabilă? Acestea sunt cifre, litere și litere de subliniere _.

Deci PHP ia ca nume tot ceea ce este între simbolul $ și primul caracter interzis.

În următorul cod, PHP va determina incorect numele variabilei și va genera o eroare:

Rezultat în browser:

Notă: variabilă nedefinită: pricerub în D:\OpenServer\domains\site\index.php pe linia 3

Pentru ca PHP să determine corect numele unei variabile dintr-un șir, trebuie să o plasați între acolade ():

Rezultat în browser:

1499 rub

Nu există un consens clar cu privire la ce ghilimele ar trebui folosite pentru șirurile obișnuite în care nu trebuie înlocuit nimic. Cu toate acestea, mulți programatori preferă să folosească ghilimele simple.

Faptul este că pentru mulți oameni ghilimele duble evocă asocierea „trebuie inserat ceva în această linie”. Prin urmare, vă recomand să folosiți ghilimele simple pentru text obișnuit și ghilimele duble numai atunci când trebuie să înlocuiți o variabilă în text. Exemplu:

Citate scăpate

Dacă trebuie să puneți ghilimele într-un șir, există 2 moduri de a face acest lucru:

În al doilea exemplu, bara oblică inversă \ scapă de ghilimele următoare, astfel încât PHP să-l trateze ca pe un șir.

Ce credeți că trebuie făcut pentru a afișa doar barele oblice inverse pe ecran? La urma urmei, va scăpa de citatul de închidere. Este amuzant, dar trebuie să scrieți o a doua bară pentru a scăpa de prima:

Tabelare și întreruperi de rând între ghilimele duble

Bara oblică inversă între ghilimele duble vă permite să scăpați nu numai de ghilimele și de sine, ci și de alte caractere. Cele mai populare sunt tab (spațiul lung pe care îl obțineți când apăsați TAB) și ruptură de linie. Arata asa:

Scrieți un script care:
1. Creează o variabilă $type cu valoarea Game.
2. Creează o variabilă $name cu valoarea „World of Warcraft” (cu ghilimele).
3. Afișează ambele variabile în interiorul etichetei

. Trebuie să existe un spațiu între variabile.

Valorile de tip șir sunt șiruri de text (șiruri pe scurt). Un șir este o secvență de zero sau mai multe caractere. Caracterele includ litere, cifre, semne de punctuație, caractere speciale și spații.

Un șir poate fi definit în patru moduri diferite:

  • ghilimele duble
  • ghilimele simple
  • sintaxa heredoc
  • sintaxa nowdoc

Șir între ghilimele duble

Șir între ghilimele duble:

Puteți utiliza secvențe de escape în șiruri de caractere duble. Secvență de control— acestea sunt caractere speciale concepute pentru a formata textul. Următoarele secvențe de escape sunt disponibile în PHP:

Principala proprietate a șirurilor cu ghilimele duble este capacitatea de a gestiona variabilele din șiruri.


Semnul dolarului: \$";

Șirurile cuprinse între ghilimele duble pot conține ghilimele simple:

Echo „Citale unice: „”;

Șir între ghilimele simple (apostrofe)

Șir între ghilimele simple:

$str = „Șir”; echo „O linie mare poate fi împărțită în mai multe linii mici pentru a fi mai ușor de citit.”;

Spre deosebire de șirurile cu ghilimele duble și sintaxa heredoc, variabilele și secvențele de control (cu o singură excepție) cuprinse între ghilimele simple nu sunt procesate. Aceasta înseamnă că vor fi interpretate ca șir de caractere normale:

$num = 10; echo „Număr: $num
Semnul dolarului: \$";

Pentru a putea folosi ghilimele simple într-un șir cuprins între ghilimele simple, trebuie să le scăpați folosind o bară oblică inversă (\"). Dacă trebuie să scrieți ghilimele inverse în sine, trebuie să o duplicați (\\):

Echo "Folosiți ghilimele \"single\" în interior"; echo „Bară inversă: \\”;

Șirurile cuprinse între ghilimele simple pot conține ghilimele duble:

Echo „Citale duble: „”;

Sintaxa Heredoc

Sintaxa Heredoc este o modalitate alternativă de a scrie șiruri.

Un șir definit folosind sintaxa Heredoc funcționează la fel ca un șir cuprins între ghilimele duble. Diferența dintre Heredoc și un șir cu ghilimele duble este că, cu Heredoc, nu este nevoie să scapi de ghilimele duble.

Sintaxa Heredoc începe cu trei caractere<<< , после которых должен быть указан произвольный идентификатор (назовём его открывающим). Идентификатор может быть указан как в двойных кавычках, так и без них. Pe loc identificatorul trebuie să fie urmat de o nouă linie, nu ar trebui să fie după identificator alte caractere decât o nouă linie, altfel va apărea o eroare. Urmează conținutul șirului în sine. După conținutul șirului, pe o linie separată, trebuie specificat un identificator de închidere (la fel ca după<<<). Перед ним и после него не должно быть никаких пробелов или других символов, за исключением точки с запятой. Если это правило нарушено, то считается, что закрывающий идентификатор отсутствует и будет вызвана ошибка:

<<

Sintaxa Nowdoc

Sintaxa Nowdoc, ca Heredoc, este o modalitate alternativă de a scrie șiruri.

Un șir definit folosind sintaxa Nowdoc funcționează la fel ca un șir cuprins între ghilimele simple. Diferența dintre Nowdoc și un șir cu ghilimele simple este că, cu Nowdoc, nu este nevoie să scapi de ghilimele simple.

Sintaxa lui Nowdoc este similară cu Heredoc, singura diferență fiind că identificatorul de deschidere trebuie inclus între ghilimele simple:

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

Manipularea variabilelor în șiruri

Există două tipuri de sintaxă pentru manipularea variabilelor din șiruri de caractere: simpluŞi dificil.

Sintaxă simplă- acesta este momentul în care numele variabilei este indicat în rând așa cum este.

Când interpretul întâlnește un semn dolar, începe să verifice succesiv dacă toate caracterele ulterioare sunt caractere valide în numele variabilei. Deci, pentru a forma un nume de variabilă valid, captează cât mai multe caractere posibil:

$str = "Lumea!"; echo "Bună ziua $str";

Sintaxă complexă- acesta este momentul în care numele variabilei este cuprins între acolade.

Deoarece, pentru a procesa o variabilă într-o linie, interpretul captează cât mai multe caractere posibil, există situații în care interpretul nu este capabil să determine în mod independent unde se termină numele variabilei:

$sport1 = „va”; $sport2 = „picior”; echo "Îmi plac $sport1ball și $sport2ball";

În acest caz, rezultatul dorit nu va fi atins deoarece interpretul va considera $sport1 ca fiind parte din numele variabilei $sport1bol, care nu există.

Pentru a spune în mod explicit interpretului unde se termină un nume de variabilă, trebuie să includeți numele variabilei între acolade:

$sport1 = „va”; $sport2 = „picior”; echo „Îmi place ($sport1)bol și ($sport2)bol.”;

Semnul dolarului poate fi plasat fie înainte, fie după bretele:

$sport1 = „va”; $sport2 = „picior”; echo „Îmi plac $(sport1)bol și ($sport2)bol.”;

Concatenare

Concatenarea este unirea a două sau mai multe șiruri într-un șir mai mare. Concatenarea are loc folosind operatorul de concatenare - . (punct). La concatenare, fiecare linie ulterioară este adăugată la sfârșitul celei anterioare:

O valoare de orice tip care este concatenată cu un șir va fi implicit convertită într-un șir și apoi concatenată:

"; echo "Număr: " . 1; ?>

Ce tip de ghilimele ar trebui să folosesc pentru a formata șiruri - apostrofe sau ghilimele duble clasice?

Să ne uităm la diferența dintre ghilimele duble și simple în PHP și să folosim exemple pentru a afla când să folosim care.

Variabilele și secvențele de evadare pentru caracterele speciale găsite în șiruri de caractere cuprinse între ghilimele simple nu sunt procesate. Șirurile înconjurate de apostrofe sunt procesate mult mai rapid de interpretul PHP decât șirurile similare înconjurate de ghilimele duble.

Motivul aici este simplu: interpretul PHP verifică suplimentar șirurile între ghilimele duble pentru prezența variabilelor, iar dacă acestea sunt găsite, atunci în loc de numele variabilei, valoarea acesteia este inserată în șir. Dar o linie cuprinsă în apostrofe este percepută de interpret ca text obișnuit și PHP nu efectuează nicio transformare în aceste linii. Cred că este clar că procesarea șirurilor între ghilimele simple va fi mai rapidă în orice caz.

Mai întâi, să descriem cum să definim un șir și apoi să verificăm cât de repede va fi procesarea șirurilor între ghilimele simple.

Cea mai simplă modalitate de a defini un șir este să-l încadrezi între ghilimele simple ("). Pentru a utiliza ghilimele simple într-un șir cu ghilimele simple, acestea trebuie să fie precedate de o bară oblică inversă (\), adică escape. Dacă bara oblică inversă trebuie să apară înainte de un singur ghilime sau la sfârșitul rândului, trebuie să-l duplicați. Dacă încercați să scăpați de orice alt caracter, bara oblică inversă va fi de asemenea tipărită.

Iată un exemplu de utilizare a ghilimelelor simple:
// Ieșire: șir simplu
echo „Șir simplu”;
// Prints: Sunt aici
ecou „Sunt aici”;
// Ieșire: Aceasta nu va insera: \n linie nouă
echo „Acest lucru nu va insera:\nnewline”;
// Ieșiri: nici variabila $example nu va fi înlocuită
echo „Nici variabila $example nu va fi înlocuită”;

Dacă șirul este cuprins între ghilimele duble ("), PHP recunoaște mai multe secvențe de escape pentru caractere speciale și, de asemenea, înlocuiește valoarea numelui variabilei din șir. Ca și în cazul ghilimelelor simple, pentru a utiliza ghilimele duble într-un șir închis în șir dublu. ghilimele, acestea trebuie să fie precedate de un caracter backslash (\).
// Ieșire: șir simplu
echo „Șir simplu”;
Iată un exemplu de utilizare a ghilimelelor duble:
// Ieșiri: Compania „Snowdrop”
echo "Compania \"Snowdrop\"";
// Ieșire: Aceasta va duce la o nouă linie
echo „Acest lucru se va rupe la o nouă linie \n”;
// Ieșire: variabila va fi înlocuită
echo "Variabila $exemplu";

De asemenea, ar trebui să vă amintiți că secvența „\n” (linie nouă), „\r” (retur car) este pentru text simplu, nu pentru HTML. Deci nu veți vedea modificări în browser (doar în codul sursă al paginii).
Să aflăm cât de rapide sunt ghilimele simple decât ghilimelele duble. Pentru măsurători, vom scrie un scurt script de testare și vom observa imediat că dacă îl testați singur, rezultatele, care depind de hardware-ul computerului sau serverului dvs., vor fi diferite.
// Returnează marca temporală la începutul buclei
$start = microtime(true);
// Creați o buclă pentru 1 milion de iterații< 1000000; $i++) {
pentru ($i = 0; $i
}
$text = "Iată un șir de caractere";
// Calculați timpul petrecut

$timp = (microtime(true) - $start);
Rezultat: 0,09 secunde.

Dacă înlocuim ghilimele simple cu ghilimele duble:
$text = "Iată un șir de caractere";
Rezultatul va fi de 0,10 secunde.

După cum puteți vedea, atunci când utilizați șiruri de text, diferența de timp de execuție este foarte mică, s-ar putea chiar spune că nu există deloc. Distracția începe atunci când încercăm să combinăm un șir și o variabilă.

$text = "Iată șirul de caractere $i";

sau

Ghilimele simple

$text = $i."Iată un șir de caractere";

Rezultat aproximativ: 0,27 secunde.

Diferența este destul de vizibilă. Concatenarea și ghilimelele duble afectează în mod clar performanța atunci când variabilele sunt adăugate în șir.

Când serverul procesează codul, verifică tot conținutul ghilimelelor duble pentru variabile, constante și multe altele. Este nevoie de timp. Iar serverul procesează ceea ce este între ghilimele simple ca text gata făcut și nu-i pasă de ce este acolo. Diferența dintre performanța ghilimelelor simple și duble este foarte mică, dar dacă dezvoltați un proiect foarte încărcat, atunci câteva milisecunde salvate reprezintă deja o victorie.:

Ghilimele duble

Nu este un secret pentru nimeni că ghilimele în PHP pot fi simple sau duble. Să aflăm când anumite utilizări ale ghilimelelor sunt mai potrivite.

Cel mai simplu mod de a defini un șir este de a include textul între ghilimele simple.

Un șir cuprins între ghilimele duble recunoaște cele mai multe secvențe de escape pentru caracterele speciale.

Cea mai importantă diferență este faptul că ghilimelele duble gestionează variabile.

Exemple de utilizare a ghilimelelor duble:

Să ne concentrăm asupra faptului că șirurile cu ghilimele duble gestionează variabile.

Ce se întâmplă când un șir este procesat? Interpret verificați fiecare șir cu ghilimele duble pentru variabile, adică are loc parsarea forțată, ceea ce necesită timp suplimentar. Da, adesea aceasta este o fracțiune de secundă, dar faptul în sine trebuie înțeles. Adică, dacă comparați procesarea unui șir cu ghilimele diferite (fără variabile, desigur), atunci un șir cu ghilimele simple va fi cu siguranță procesat mai repede.

Calcule

Am găsit calcule interesante pe acest subiect pe site-ul ProfiPHP. Autorul a scris un script simplu cu care a calculat timpul de procesare a șirurilor.

© 2024 ermake.ru -- Despre repararea PC-ului - Portal de informații