Aký je rozdiel medzi jednoduchými a dvojitými úvodzovkami v php. Aký je rozdiel medzi jednoduchými a dvojitými úvodzovkami v PHP? Podrobnosti implementácie typu reťazca

Nie je žiadnym tajomstvom, že úvodzovky v PHP môžu byť jednoduché alebo dvojité. Poďme zistiť, kedy sú niektoré použitia úvodzoviek vhodnejšie.

Jednoduché úvodzovky

Najjednoduchší spôsob, ako definovať reťazec, je uzavrieť text do jednoduchých úvodzoviek.

Ak potrebujeme v texte použiť jednu úvodzovku, musíme ju ukončiť lomkou (\).

Únikové sekvencie v jednoduchých úvodzovkách nefungujú.

Príklady použitia jednoduchých úvodzoviek:

Dvojité úvodzovky

Ak text zvýrazníte dvojitými úvodzovkami, reťazec bude definovaný rovnakým spôsobom ako pri jednoduchých úvodzovkách. Ale medzi úvodzovkami sú samozrejme rozdiely.

Situácia s úvodzovkami je rovnaká ako s jednoduchými úvodzovkami.

Reťazec, ktorý je uzavretý v úvodzovkách, rozpoznáva väčšinu sekvencií escape pre špeciálne znaky.

Najdôležitejším rozdielom je skutočnosť, že dvojité úvodzovky spracovávajú premenné.

Príklady použitia dvojitých úvodzoviek:

Zamerajme sa na to, že reťazce s dvojitými úvodzovkami spracovávajú premenné.

Čo sa stane pri spracovaní reťazca? Tlmočník skontrolujte každý reťazec dvojitými úvodzovkami pre premenné, t.j. dochádza k nútenej analýze, čo si vyžaduje ďalší čas. Áno, často je to zlomok sekundy, ale treba pochopiť samotnú skutočnosť. To znamená, že ak porovnáte spracovanie jedného reťazca s rôznymi úvodzovkami (samozrejme bez premenných), reťazec s jednoduchými úvodzovkami bude určite spracovaný rýchlejšie.

Výpočty

Na stránke ProfiPHP som našiel zaujímavé výpočty pre táto téma. Autor napísal jednoduchý scenár, pomocou ktorého vypočítal čas spracovania reťazcov.

Tento krátky článok ukazuje, ako a kde ho použiť úvodzovky v PHP.

Jednoduché úvodzovky (apostrofy) v PHP

Reťazce uzavreté v jednoduchých úvodzovkách PHP žiadnym spôsobom nespracováva. To znamená, že jednoduché úvodzovky predstavujú text, ktorý je medzi nimi uzavretý.

// Správne echo "Aký je život?"; echo "Aký je život? $name"; echo "Aký je život?".$meno; // Nesprávne echo "Ako sa máš? $name";

Špeciálne znaky v jednoduchých a dvojitých úvodzovkách

Aby ste napríklad zabezpečili, že sa napríklad znak tabulátora (\t) bude interpretovať ako znak tabulátora a nie ako lomka a písmeno t, musíte riadok textu, ktorý obsahuje znak tabulátora, uzavrieť do dvojitých úvodzoviek. \' a \\ môžete použiť iba v jednoduchých úvodzovkách. Všetky ostatné sekvencie escape (\n, \r, \$, atď.) nie sú povolené v jednoduchých úvodzovkách.

// Nesprávne echo "Ako sa máš?\n"; // Správne echo "Ako sa máš?\n";

Ak chcete ukončiť dvojité úvodzovky v reťazci, umiestnite úvodzovky pred opačnú lomku \" .

// Nesprávna ozvena "

Čo sa deje?

"; // Správna ozvena"

Čo sa deje?

"; echo"

Čo sa deje?

";

Dvojité úvodzovky v PHP

S textom v úvodzovkách sa zaobchádza veľmi odlišne. Napríklad premenné v úvodzovkách sú nahradené ich hodnotami. Vďaka tomu je skladanie pohodlné SQL dotazy pomocou dvojitých úvodzoviek.

$dotaz = "INSERT INTO table (post,author,text,date) VALUES ("$id","$author","$text","$date"");

Nie som odborník na programovanie v PHP, ale som trochu zmätený, prečo vidím nejaký kód v PHP s reťazcom uzavretým v jednoduchých a niekedy dvojitých úvodzovkách.

Len viem, že v jazyku .NET alebo C, ak je to v jednoduchých úvodzovkách, znamená to, že je to znak a nie reťazec.

Riešenie

Čo by ste mali vedieť

$a = "meno"; $b = "moje $a"; == "moje meno" $c = "moje $a"; != "moje meno"

V PHP ľudia používajú jednoduché úvodzovky na definovanie konštantného reťazca ako "a" , "moje meno" , "abc xyz", zatiaľ čo dvojité úvodzovky používajú na definovanie reťazca obsahujúceho identifikátor ako "a $b $c $d" .

A ďalšia vec je

Echo "moje meno";

Rýchlejší než

Echo "moje meno";

Echo "moje". $a;

pomalšie ako

Echo "moje $a";

To platí pre ostatné použité reťazce.

V PHP sa text v jednoduchých úvodzovkách považuje za hodnotu reťazca, zatiaľ čo text v dvojitých úvodzovkách analyzuje premenné nahradením a spracovaním ich hodnoty.

$test = "premenná"; echo "Dobrý deň, pán $test"; // výstup by bol: Hello Mr variable echo "Hello Mr $test"; // výstup by bol: Dobrý deň, pán $test

Tu dvojitá úvodzovka analyzuje hodnotu a jednoduchá úvodzovka sa považuje za hodnotu reťazca (bez analýzy premennej $test.)

Oba druhy vnorených znakov sú reťazce. Na uzavretie iného typu cenovej ponuky je vhodné použiť jeden typ cenovej ponuky. """ a """ Najväčší rozdiel medzi typmi úvodzoviek je v tom, že odkazy na vnorené identifikátory sú nahradené v dvojitých úvodzovkách, a nie v jednoduchých úvodzovkách.

Najjednoduchší spôsob, ako definovať reťazec, je uzavrieť ho do jednoduchých úvodzoviek (symbol " ).

Ak chcete v reťazci použiť jednu úvodzovku, uzavrite ju spätnou lomkou ( \ ). Ak potrebujete napísať samotnú spätnú lomku, duplikujte ju ( \\ ). Všetky ostatné použitia spätných lomiek sa budú interpretovať ako normálne znaky: to znamená, že ak sa pokúsite použiť iné únikové sekvencie, ako napr. \r alebo \n, budú na výstupe tak, ako sú, namiesto akéhokoľvek špeciálneho správania.

ozvena "toto je jednoduchý reťazec";

ozvena „Vkladať sa dá aj do riadkov
postava z nového riadku, ako je táto,
Toto je fajn"
;

// Výstupy: Arnold raz povedal: "Vrátim sa"
ozvena "Jedného dňa Arnold povedal: "Vrátim sa.";

Echo "Odstránili ste C:\\*.*?";

// Výstupy: Vymazali ste C:\*.*?
echo "Vymazali ste C:\*.*?" ;

// Výstupy: Toto sa nerozbalí: \n nový riadok
ozvena "Toto sa nerozbalí: \n nový riadok";

// Výstupy: $expand a $either premenné nie sú expandované
ozvena "$expand a $either premenné nie sú rozšírené";
?>

Dvojité úvodzovky

Ak je reťazec uzavretý v úvodzovkách ("), PHP rozpoznáva ďalšie escape sekvencie pre špeciálne znaky:

Únikové sekvencie
Následná sekvencia Význam
\n nový riadok (LF alebo 0x0A (10) v ASCII)
\r návrat vozíka (CR alebo 0x0D (13) v ASCII)
\t horizontálna karta (HT alebo 0x09 (9) v ASCII)
\v vertikálna karta (VT alebo 0x0B (11) v ASCII) (od PHP 5.2.5)
\e escape znak (ESC alebo 0x1B (27) v ASCII) (od PHP 5.4.4)
\f zoznam stránok (FF alebo 0x0C (12) v ASCII) (od PHP 5.2.5)
\\ spätné lomítko
\$ znak dolára
\" dvojitý citát
\{1,3} postupnosť znakov zodpovedajúca regulárnemu výrazu znaku v osmičkovej číselnej sústave
\x(1,2) postupnosť znakov zodpovedajúca regulárnemu výrazu znaku v hexadecimálnom zápise

Rovnako ako v prípade reťazca uzavretého v jednoduchých úvodzovkách, escapovanie ľubovoľného znaku spôsobí aj výstup samotnej spätnej lomky. Pred PHP 5.1.1 použite spätné lomítko \($var) nebola zverejnená.

Heredoc

Tretím spôsobom, ako definovať reťazce, je použiť syntax heredoc: <<< . Za týmto operátorom musíte zadať identifikátor a potom posun riadkov. Potom nasleduje samotný riadok a potom rovnaký identifikátor, ktorý uzatvára vkladanie.

Linka musieť začínať koncovým identifikátorom, t.j. musí sa objaviť v prvom stĺpci riadku. Okrem toho musí identifikátor spĺňať rovnaké pravidlá pomenovania ako všetky ostatné značky v PHP: obsahovať iba alfanumerické znaky a podčiarkovník a nesmie začínať číslom (podčiarkovníky sú povolené).

Pozornosť

Je veľmi dôležité poznamenať, že záverečný riadok identifikátora nesmie obsahovať žiadne iné znaky okrem bodkočiarky ( ; ). To znamená, že id by nemali byť odsadené a že pred ani za bodkočiarkou nemôžu byť žiadne medzery ani tabulátory. Je tiež dôležité pochopiť, že prvý znak pred koncovým identifikátorom musí byť znak nového riadku, ako ho definuje váš operačný systém. Napríklad na systémoch UNIX, vrátane Mac OS X, toto \n. Bezprostredne za koncovým identifikátorom musí začínať aj nový riadok.

Ak je toto pravidlo porušené a koncový identifikátor nie je „čistý“, považuje sa koncový identifikátor za chýbajúci a PHP ho bude ďalej hľadať. Ak sa v tomto prípade nikdy nenájde správny koncový identifikátor, spôsobí to chybu analýzy s číslom riadku na konci skriptu.

Heredoc nemožno použiť na inicializáciu polí triedy. Počnúc PHP 5.3 sa toto obmedzenie vzťahuje len na heredocs obsahujúce premenné.

Príklad č. 1 Nesprávny príklad

trieda foo (
verejný $bar =<<bar
EOT;
}
?>

Text Heredoc sa správa rovnako ako reťazec v dvojitých úvodzovkách bez toho, aby ich mal. To znamená, že v heredoc nemusíte uvádzať úvodzovky, ale stále môžete použiť sekvencie escape vyššie. Premenné sa spracúvajú, ale pri používaní komplexných premenných v rámci heredocu musíte byť rovnako opatrní ako pri práci s reťazcami.

Príklad #2 Príklad definovania reťazca heredoc

$str =<<Príklad riadku,
pokrýva niekoľko riadkov,
pomocou syntaxe heredoc.
EOD;

Trieda foo
{
var $foo ;
var $bar ;

Funkcia foo()
{
$this -> foo = "Foo" ;
$this ->
}
}

$foo = new foo();
$name = "Moje meno" ;

ozvena<<Moje meno je "$name". Píšem $foo -> foo .
Teraz dedukujem
( $foo -> bar [ 1 ]) .
Výsledkom by malo byť veľké písmeno "A": \x41
EOT;
?>

Moje meno je "Moje meno". píšem Foo. Teraz vypíšem Bar2. Výsledkom by malo byť veľké písmeno "A": A

Je tiež možné použiť syntax heredoc na prenos údajov cez argumenty funkcie:

Od verzie 5.3.0 je možné inicializovať statické premenné a vlastnosti/konštanty triedy pomocou syntaxe heredoc:

Príklad #4 Použitie heredoc na inicializáciu statických premenných

// Statické premenné
funkcia foo()
{
statický $bar =<<Nič tu nie je...
ŠTÍTOK;
}

// Vlastnosti/konštanty triedy
trieda foo
{
const BAR =<<Príklad použitia konštanty
FOOBAR;

Verejný $baz =<<Príklad použitia poľa
FOOBAR;
}
?>

Od PHP 5.3.0 môžete tiež umiestniť identifikátor Heredoc do dvojitých úvodzoviek:

Nowdoc

Nowdoc je rovnaký pre reťazce v jednoduchých úvodzovkách ako heredoc pre reťazce s dvojitými úvodzovkami. Nowdoc je podobný ako heredoc, ale vo vnútri nevykonávajú sa žiadne náhrady. Tento dizajn je ideálny na vkladanie kódu PHP alebo iných veľkých blokov textu bez toho, aby ste ho museli opustiť. V tomto je trochu podobný konštruktu SGML vyhlásením bloku textu, ktorý nie je určený na spracovanie.

Nowdoc je označený rovnakou sekvenciou <<< , ktorý sa používa v heredoc, ale nasledujúci identifikátor je uzavretý v jednoduchých úvodzovkách, napr. <<<"EOT" . Všetky podmienky, ktoré sa vzťahujú na identifikátory heredoc, sa vzťahujú aj na nowdoc, najmä tie, ktoré sa vzťahujú na koncový identifikátor.

Príklad č. 6 Príklad Nowdoc

$str =<<<"EOD"
Ukážkový text,
zahŕňajúce niekoľko riadkov
pomocou syntaxe nowdoc.
EOD;

/* Zložitejší príklad s premennými. */
trieda foo
{
verejné $foo ;
verejný $bar ;

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

$foo = new foo();
$name = "Moje meno" ;

ozvena<<<"EOT"
Moje meno je "$name". Tlačím $foo->foo.
Teraz tlačím ($foo->bar).
Toto by nemalo vydávať veľké "A": \x41
EOT;
?>

Výsledok spustenia tohto príkladu:

Moje meno je "$name". Tlačím $foo->foo. Teraz tlačím ($foo->bar). Toto by nemalo vydávať veľké "A": \x41

Komentujte:

Na rozdiel od heredoc možno nowdoc použiť v akomkoľvek kontexte so statickými údajmi. Typický príklad inicializácie polí triedy alebo konštánt:

Príklad č. 7 Príklad použitia statických údajov

trieda foo (
verejný $bar =<<<"EOT"
bar
EOT;
}
?>

Komentujte:

Podpora nowdoc bola pridaná v PHP 5.3.0.

Manipulácia s premennými

Ak je reťazec zadaný v úvodzovkách alebo pomocou heredoc, premenné v ňom sú spracované.

Existujú dva typy syntaxe: jednoduchá a zložitá. Jednoduchá syntax je jednoduchšia a pohodlnejšia. Umožňuje spracovať premennú, hodnotu poľa ( pole) alebo vlastnosti objektu ( objekt) s minimálnym úsilím.

Zložitú syntax možno identifikovať podľa zložených zátvoriek okolo výrazu.

Jednoduchá syntax

Ak tlmočník narazí na znak dolára ( $ ), zachytí čo najviac znakov, aby vytvoril platný názov premennej. Ak chcete zadať koniec názvu, uzatvorte názov premennej do zložených zátvoriek.

$šťava = "jablko" ;

echo "Vypil nejaký $džúsový džús." . PHP_EOL ;
// nefunguje, "s" je platný znak pre názov premennej,
// ale naša premenná sa volá $šťava.
echo "Vypil nejaký džús vyrobený z $džúsov." ;
?>

Výsledok spustenia tohto príkladu:

Vypil trochu jablkového džúsu. Vypil trochu šťavy vyrobenej z .

Prvok poľa ( pole) alebo vlastnosť objektu ( objekt). V indexoch poľa je uzatváracia hranatá zátvorka ( ] ) označuje koniec definície indexu. Pre vlastnosti objektu platia rovnaké pravidlá ako pre jednoduché premenné.

Príklad #8 Jednoduchý príklad syntaxe

$juices = array("jablko" , "pomaranč" , "koolaid1" => "fialová" );

echo "Vypil nejaké $džúsy [ 0 ] šťavy." . PHP_EOL ;
echo "Vypil nejaké $džúsy [ 1 ] šťavy." . PHP_EOL ;
echo "Vypil nejaké $džúsy [ koolaid1 ] džús." . PHP_EOL ;

triedni ľudia (
public $john = "John Smith" ;
public $jane = "Jane Smith" ;
public $robert = "Robert Paulsen" ;

Verejné $kováč = "Kovář" ;
}

$people = noví ľudia();

echo "$people -> John vypil $juices [ 0 ] džús." . PHP_EOL ;
echo " $people -> john potom pozdravil $people -> jane ." . PHP_EOL ;
echo "$people -> manželka Johna pozdravila $people -> robert." . PHP_EOL;
echo " $people -> robert pozdravil dvoch $people -> smiths ." ; // Nefunguje
?>

Výsledok spustenia tohto príkladu:

Vypil trochu jablkového džúsu. Vypil trochu pomarančového džúsu. Napil sa fialovej šťavy. John Smith vypil trochu jablkového džúsu. John Smith potom pozdravil Jane Smith. Manželka Johna Smitha pozdravila Roberta Paulsena a Robert Paulsen ich pozdravil.

Pre čokoľvek zložitejšie použite komplexnú syntax.

Komplexná (kučeravá) syntax

Nazýva sa komplexný nie preto, že je ťažko pochopiteľný, ale preto, že umožňuje použitie zložitých výrazov.

Akákoľvek skalárna premenná, prvok poľa alebo vlastnosť objektu namapovaná na reťazec môže byť reprezentovaná v reťazci pomocou tejto syntaxe. Jednoducho napíšte výraz rovnakým spôsobom ako mimo riadku a potom ho zabaľte { A } . Pretože { nemôže byť escapované, táto syntax bude rozpoznaná iba vtedy $ nasleduje priamo { . Použite {\$ vytlačiť {$ . Niekoľko názorných príkladov:

// Zobraziť všetky chyby
error_reporting(E_ALL);

$skvelý = "skvelý" ;

// Nefunguje, výstupy: Toto je (skvelé)
echo "Toto je ( $skvelé )" ;

// Práce, výstupy: Toto je skvelé
echo "Toto je ($skvelé)" ;
echo "Toto je $( skvelé )" ;

// Tvorba
ozvena „Toto námestie je široké( $square -> width ) 00 centimetrov." ;

// Funguje, kľúčové slová v úvodzovkách fungujú len so syntaxou zložených zátvoriek
echo "Funguje to: ( $arr [ "kľúč" ]) " ;

// Tvorba
echo "Funguje to: ( $arr [ 4 ][ 3 ]) " ;

// Toto je neplatné z rovnakého dôvodu ako $foo vonku
// riadky. Inými slovami, stále to bude fungovať,
// ale keďže PHP hľadá najprv konštantu foo, spôsobí to
// chyba úrovne E_NOTICE (nedefinovaná konštanta).
ozvena „Nie je správne:( $arr [ foo ][ 3 ]) " ;

// Tvorba. Pri internom používaní viacrozmerných polí
// riadky vždy používajú zložené zátvorky
echo "Funguje to: ( $arr [ "foo" ][ 3 ]) " ;

// Tvorba.
echo "Funguje to: ". $arr [ "foo" ][ 3 ];

ozvena "Funguje aj toto:( $obj -> hodnoty ​​[ 3 ]-> meno ) " ;

ozvena „Toto je hodnota pomenovanej premennej$meno : ($( $meno)) ";

ozvena "Toto je hodnota názvu premennej, ktorú getName() vracia:($( getName ())) ";

ozvena "Toto je hodnota premennej podľa názvu, ktorú \$object->getName() vracia:($( $object -> getName ())) ";

// Nefunguje, výstupy: GetName() vracia toto: (getName())
ozvena "Toto vracia getName(): (getName())";
?>

Pomocou tejto syntaxe je tiež možné pristupovať k vlastnostiam objektu v rámci reťazcov.

trieda foo (
var $bar = "Ja som bar." ;
}

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

Výsledok spustenia tohto príkladu:

ja som bar. ja som bar.

Komentujte:

Funkcie, volania metód, statické premenné tried a konštanty tried fungujú interne {$} , počnúc PHP 5. Zadaná hodnota sa však bude považovať za názov premennej v rovnakom kontexte ako riadok, v ktorom je definovaná. Použitie jednoduchých zložených zátvoriek ( {} ) nebude fungovať pre prístup k hodnotám funkcií, metód, konštánt triedy alebo statických premenných triedy.

// Zobraziť všetky chyby
error_reporting(E_ALL);

triedne pivá (
const softdrink = "koreňové pivo" ;
public static $ale = "ipa" ;
}

$rootbeer = "A & W" ;
$ipa = "S Alexandrom Keithom" ;

// Funguje to, výstupy: Chcel by som A & W
echo "Chcel by som ($( piva :: nealkoholický nápoj )) \n" ;

// Toto funguje tiež, výstupy: Chcel by som Alexandra Keitha
echo "Chcel by som ($( piva :: $ale )) \n" ;
?>

Prístup a zmena znaku v reťazci

Znaky v reťazcoch je možné používať a upravovať zadaním ich posunu od začiatku reťazca, počnúc nulou, v hranatých zátvorkách za reťazcom, napríklad $str . Predstavte si reťazec na tento účel ako pole znakov. Ak potrebujete získať alebo nahradiť viac ako 1 znak, môžete použiť funkcie substr() A substr_replace().

Komentujte: K znaku v reťazci možno pristupovať aj pomocou zložených zátvoriek, napríklad $str(42) .

Pozornosť

Pokus o zápis do posunu za hranicami riadku vyplní reťazec medzerami až do tohto posunu. Neceločíselné typy sa skonvertujú na celočíselné typy. Nesprávny typ posunu spôsobí chybu úrovne E_NOTICE. Zápis do záporného posunu spôsobí chybu úrovne E_NOTICE a pri prečítaní vráti prázdny reťazec. Použije sa iba prvý znak priradeného reťazca. Priradením k prázdnemu reťazcu sa priradí nulový bajt (NULL).

Pozornosť

Reťazce v PHP sú interne polia bajtov. V dôsledku toho nie je prístup alebo úprava reťazca s posunom bezpečné pre viacbajtové kódovanie a malo by sa vykonávať iba s reťazcami v jednobajtových kódovaniach, ako je ISO-8859-1.

Príklad #9 Niekoľko príkladov reťazcov

// Získa prvý znak reťazca
$str = "Toto je test." ;
$first = $str [ 0 ];

// Získame tretí znak reťazca
$tretina = $str [ 2 ];

// Získanie posledného znaku reťazca
$str = "Toto je stále test." ;
$posledny = $str [ strlen ($str ) - 1 ];

// Zmena posledného znaku riadku
$str = "Pozrite sa na more" ;
$str [ strlen ($str )- 1 ] = "e" ;

?>

Od PHP 5.4 musí byť offset v reťazci špecifikovaný buď ako celé číslo alebo reťazec obsahujúci číslice, inak sa zobrazí varovanie. Predtým offset daný reťazcom ako "foo", sa bez varovania premenil na 0 .

Príklad #10 Rozdiely medzi PHP 5.3 a 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" ]));
?>

Výsledok spustenia tohto príkladu v PHP 5.3:

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

Výsledok spustenia tohto príkladu v PHP 5.4:

string(1) "b" bool(true) Upozornenie: Neplatný posun reťazca "1.0" v /tmp/t.php na riadku 7 string(1) "b" bool(false) Upozornenie: Neplatný posun reťazca "x" v / tmp/t.php na riadku 9 string(1) "a" bool(false) string(1) "b" bool(false)

Komentujte:

Pokus o prístup k premenným iných typov (okrem polí alebo objektov, ktoré implementujú určité rozhrania) pomocou alebo {} sa potichu vráti NULOVÝ.

Komentujte:

PHP 5.5 pridalo podporu pre prístup k znakom v reťazcových literáloch pomocou syntaxe alebo {} .

Existuje mnoho užitočných funkcií na úpravu reťazcov.

Základné funkcie sú popísané v časti o funkciách reťazcov a pre pokročilé vyhľadávanie a nahradzovanie regulárnych výrazov alebo funkcií regulárnych výrazov kompatibilných s jazykom Perl.

Previesť na reťazec

Hodnotu je možné previesť na reťazec pomocou pretypovania (reťazec) alebo funkcie strval(). Vo výrazoch, kde sa vyžaduje reťazec, sa konverzia uskutoční automaticky. Stáva sa to pri používaní funkcií ozvena alebo vytlačiť, alebo keď sa hodnota premennej porovnáva s reťazcom. Keď si v príručke prečítate časti Typy a Manipulácia s typmi, budú nasledujúce informácie jasnejšie. pozri tiež settype().

Polia sa vždy skonvertujú na reťazec "Pole", takže nemôžete zobraziť obsah poľa ( pole), použitím ozvena alebo vytlačiť aby ste videli, čo obsahuje. Ak chcete zobraziť jeden prvok, použite niečo ako echo $arr["foo"]. Nižšie nájdete tipy, ako zobraziť/zobraziť celý obsah.

Objekty v PHP 4 boli vždy konvertované na reťazec "objekt". Ak chcete zobraziť hodnoty polí objektu ( objekt) na účely ladenia čítajte ďalej. Ak chcete získať názov triedy požadovaného objektu, použite get_class(). Od PHP 5 je dostupná aj metóda __toString.

NULOVÝ sa vždy skonvertuje na prázdny reťazec.

Ako vidíte vyššie, priama konverzia polí, objektov alebo zdrojov na reťazec neposkytuje žiadne užitočné informácie o samotných hodnotách okrem ich typov. Lepším spôsobom výstupu hodnôt na ladenie je použitie funkcií print_r() A var_dump().

Väčšinu hodnôt v PHP je možné previesť na reťazec pre trvalé ukladanie. Táto metóda sa nazýva serializácia a možno ju vykonať pomocou funkcie serializovať (). Okrem toho, ak má vaša inštalácia PHP podporu WDDX, je možná aj serializácia do štruktúry XML.

Prevod reťazcov na čísla

Ak je reťazec rozpoznaný ako číselná hodnota, výsledná hodnota a typ sa určia nasledovne.

Ak reťazec neobsahuje žiadny zo znakov ".", "e" alebo "E" a hodnota čísla spadá do rozsahu celých čísel (definované PHP_INT_MAX), reťazec bude rozpoznaný ako celé číslo ( celé číslo). Vo všetkých ostatných prípadoch sa považuje za číslo s pohyblivou rádovou čiarkou ( plavák).

Hodnota je určená začiatkom reťazca. Ak riadok začína platnou číselnou hodnotou, použije sa táto hodnota. V opačnom prípade bude hodnota 0 (nula). Platná číselná hodnota je jedna alebo viac číslic (ktoré môžu obsahovať desatinnú čiarku), pred ktorými môže byť znamienko, za ktorým nasleduje voliteľný exponent. Exponent je "e" alebo "E", za ktorým nasleduje jedna alebo viac číslic.

$foo = 1 + "10,5" ; // $foo je plavák (11.5)
$foo = 1 + "-1,3e3" ; // $foo je plavák (-1299)
$foo = 1 + "bob-1.3e3" ; // $foo je celé číslo (1)
$foo = 1 + "bob3" ; // $foo je celé číslo (1)
$foo = 1 + "10 malých prasiatok" ; // $foo je celé číslo (11)
$foo = 4 + "10,2 malých prasiatok" ; // $foo je plavák (14.2)
$foo = "10,0 ošípaných" + 1 ; // $foo is float (11)
$foo = "10,0 ošípaných" + 1,0 ; // $foo is float (11)
?>

Viac detailné informácie Informácie o tejto konverzii nájdete v časti o strtod(3) v dokumentácii Unix.

Ak chcete otestovať niektorý z príkladov v tejto časti, skopírujte ho a prilepte ho a nasledujúci riadok, aby ste videli, čo sa stane:

echo "\$foo== $foo ; napíšte: " . gettype ($foo) . "
\n" ;
?>

Nečakajte, že kód znaku získate jeho konverziou na celé číslo (ako sa to robí napríklad v C). Ak chcete previesť znaky na ich kódy ASCII a späť, použite funkcie ord() A chr().

Podrobnosti implementácie typu reťazca

Typ reťazca ( reťazec) v PHP je implementovaný ako pole bajtov a celé číslo obsahujúce dĺžku vyrovnávacej pamäte. Neobsahuje žiadne informácie o tom, ako tieto bajty previesť na znaky, pričom túto úlohu ponecháva na programátora. Neexistujú žiadne obmedzenia na obsah reťazca, ako je napríklad bajt s hodnotou 0 (bajt "NUL") sa môže nachádzať kdekoľvek (uvedomte si však, že niektoré funkcie, ako je uvedené v tomto návode, nie sú "binárne bezpečné", t. j. môžu odovzdať reťazce knižniciam, ktoré ignorujú údaje po byte NUL).

Táto povaha typu reťazca vysvetľuje, prečo PHP nemá samostatný typ „byte“ – túto úlohu zohrávajú reťazce. Funkcie, ktoré vracajú netextové dáta – napríklad ľubovoľný dátový tok načítaný zo sieťového soketu – stále vracajú reťazce.

Vzhľadom na skutočnosť, že PHP nediktuje špecifické kódovanie pre reťazce, možno sa pýtať, ako sa potom reťazcové literály kódujú. Napríklad linka "á" ekvivalent "\xE1"(ISO-8859-1), "\xC3\xA1"(UTF-8, normalizačná forma C), "\x61\xCC\x81"(UTF-8, normalizačná forma D) alebo nejaké iné možné zobrazenie? Odpoveď je, že reťazec bude zakódovaný tak, ako je zapísaný v súbore skriptu. Ak je teda skript napísaný v kódovaní ISO-8859-1, reťazec bude zakódovaný v kódovaní ISO-8859-1 atď. Toto pravidlo však neplatí, keď je povolený režim Zend Multibyte: v tomto prípade môže byť skript napísaný v akomkoľvek kódovaní (buď explicitne špecifikovanom alebo automaticky určenom) a potom konvertovaný na špecifické interné kódovanie, ktoré sa následne použije na reťazcové literály. Upozorňujeme, že kódovanie skriptu (alebo interné kódovanie, ak je povolený Zend Multibyte) má určité obmedzenia: kódovanie musí byť takmer vždy nadmnožinou ASCII, ako napríklad UTF-8 alebo ISO-8859-1. Všimnite si tiež, že kódovania závislé od stavu, kde sa môžu použiť rovnaké bajtové hodnoty v počiatočnom a nepočiatočnom stave posunu, môžu spôsobiť problémy.

Samozrejme, aby boli funkcie reťazca užitočné, musia mať určité predpoklady o kódovaní reťazca. Bohužiaľ, medzi funkciami PHP existuje pomerne široká škála prístupov k tomuto problému:

  • Niektoré funkcie predpokladajú, že reťazec je zakódovaný v nejakom jednobajtovom kódovaní, ale nepotrebujú interpretovať bajty ako špecifické znaky, aby fungovali správne. Do tejto kategórie patrí napr. substr(), strpos(), strlen() A strcmp(). Iný spôsob uvažovania o týchto funkciách je, že fungujú na vyrovnávacích pamäťových poliach, t.j. pracujú priamo s bajtmi a ich posunmi. posuny.
  • Iné funkcie očakávajú, že kódovanie bude odovzdané ako parameter, možno za predpokladu nejakého predvoleného kódovania, ak nebol špecifikovaný parameter kódovania. Táto funkcia je
  • Nakoniec existujú funkcie, ktoré predpokladajú, že reťazec používa špecifické kódovanie, zvyčajne UTF-8. Väčšina funkcií z rozšírení intl a PCRE patrí sem (v druhom prípade iba pri zadaní modifikátora u). Aj keď sa to robí zámerne, funkcia utf8_decode() znamená kódovanie UTF-8 a utf8_encode()- ISO-8859-1.

V konečnom dôsledku písanie správnych programov, ktoré pracujú s Unicode, znamená starostlivo sa vyhýbať funkciám, ktoré nefungujú s Unicode a pravdepodobne poškodzujú údaje, a namiesto toho používať platné funkcie, zvyčajne z rozšírení intl a mbstring. Používanie funkcií s podporou Unicode je však dobrý začiatok. Bez ohľadu na funkcie, ktoré jazyk poskytuje, je potrebné poznať samotnú špecifikáciu Unicode. Napríklad, ak program predpokladá, že v jazyku existujú iba malé a veľké písmená, potom robí veľkú chybu.

Aký typ úvodzoviek mám použiť na formátovanie reťazcov – apostrofy alebo klasické dvojité úvodzovky?

Pozrime sa na rozdiel medzi dvojitými a jednoduchými úvodzovkami v PHP a pomocou príkladov zistíme, kedy ktoré použiť.

Premenné a sekvencie escape pre špeciálne znaky nachádzajúce sa v reťazcoch uzavretých v jednoduchých úvodzovkách sa nespracujú. Reťazce obklopené apostrofmi spracováva PHP interpret oveľa rýchlejšie ako podobné reťazce ohraničené dvojitými úvodzovkami.

Dôvod je tu jednoduchý: PHP interpret navyše kontroluje reťazce v úvodzovkách na prítomnosť premenných, a ak sa nájdu, tak namiesto názvu premennej sa do reťazca vloží jej hodnota. Ale riadok uzavretý v apostrofoch interpret vníma ako bežný text a PHP v týchto riadkoch nevykonáva žiadne transformácie. Myslím, že je jasné, že spracovanie reťazcov v jednoduchých úvodzovkách bude v každom prípade rýchlejšie.

Najprv si popíšme, ako definovať reťazec, a potom skontrolujte, o koľko rýchlejšie bude spracovanie reťazcov v jednoduchých úvodzovkách.

Najjednoduchší spôsob, ako definovať reťazec, je uzavrieť ho do jednoduchých úvodzoviek ("). Ak chcete použiť jednoduché úvodzovky v reťazci s jednoduchými úvodzovkami, musí im predchádzať spätná lomka (\), to znamená escapované. Ak musí prísť spätná lomka pred jednoduchým úvodzovkom alebo na konci riadku, musíte ho duplikovať. Ak sa pokúsite uniknúť ktorémukoľvek inému znaku, vytlačí sa aj spätná lomka.

Tu je príklad použitia jednoduchých úvodzoviek:
// Výstup: Jednoduchý reťazec
echo "Jednoduchý reťazec";
// Výtlačky: Som tu
echo "som tu";
// Výstup: Toto nevloží: \n nový riadok
echo "Toto sa nevloží:\nnový riadok";
// Výstupy: Nebude nahradená ani premenná $example
echo "Nebude nahradená ani premenná $example"; Ak je reťazec uzavretý v úvodzovkách ("), PHP rozpozná veľká kvantita kontrolné sekvencie pre špeciálne znaky a tiež nahrádza svoju hodnotu namiesto názvu premennej v reťazci. Rovnako ako v prípade jednoduchých úvodzoviek, ak chcete použiť dvojité úvodzovky v reťazci s dvojitými úvodzovkami, musí im predchádzať znak spätnej lomky (\).

Tu je príklad použitia dvojitých úvodzoviek:
// Výstup: Jednoduchý reťazec
echo "Jednoduchý reťazec";
// Výstupy: Spoločnosť "Snowdrop"
echo "Spoločnosť \"Snežienka\"";
// Výstup: Toto povedie k novému riadku
echo "Toto sa zlomí na nový riadok \n";
// Výstup: Premenná bude nahradená
$example = "bude nahradené";
echo "Premenná $ príklad"; Malo by sa tiež pamätať na to, že sekvencia "\n" ( Nový riadok), "\r" (carriage return) pre obyčajný text, nie HTML. Takže neuvidíte zmeny v prehliadači (iba v zdrojový kód stránky).

Poďme zistiť, o koľko rýchlejšie sú jednoduché úvodzovky ako dvojité úvodzovky. Pre merania napíšeme krátky testovací skript a hneď si všimneme, že ak ho otestujete sami, výsledky, ktoré závisia od hardvéru vášho PC alebo servera, sa budú líšiť.
// Vráti časovú značku na začiatku cyklu
$start = microtime(true);
// Vytvorte slučku pre 1 milión iterácií
pre ($i = 0; $i< 1000000; $i++) {
$text = "Tu je reťazec znakov";
}
// Vypočítajte strávený čas
$time = (microtime(true) - $start); Výsledok: 0,09 sekundy.

Ak nahradíme jednoduché úvodzovky dvojitými úvodzovkami:
$text = "Tu je reťazec znakov"; Výsledok bude 0,10 sekundy.

Ako vidíte, pri použití textových reťazcov je rozdiel v čase vykonania veľmi malý, dokonca by sa dalo povedať, že vôbec neexistuje. Zábava začína, keď sa pokúsime spojiť reťazec a premennú.
$text = "Tu je reťazec znakov $i"; alebo
$text = $i."Tu je reťazec znakov"; Výsledok približne: 0,27 sekundy.

Rozdiel je dosť citeľný. Reťazenie a dvojité úvodzovky jasne ovplyvňujú výkon, keď sa do reťazca pridávajú premenné.

Keď server spracuje kód, skontroluje celý obsah dvojitých úvodzoviek na premenné, konštanty a ďalšie. Zaberie to čas. A server spracováva to, čo je medzi jednoduchými úvodzovkami, ako hotový text a je mu jedno, čo tam je. Rozdiel medzi výkonom jednoduchých a dvojitých úvodzoviek je veľmi malý, ale ak vyvíjate vysoko zaťažený projekt, ušetrených pár milisekúnd je už víťazstvom.