Jednoduché a dvojité uvozovky v PHP

(publikováno 17.02.2015) PHP

V PHP a ve většině jiných skriptovacích jazyků, lze psát text jak do jednoduchých uvozovek, tak do dvojitých. Interpretace obou textů ovšem probíhá různě. Ukážeme si jaké rozdíly a problémy to může přinést a jak to vyřešit.

Jednoduché a dvojité uvozovky v PHP

V běžných programovacích jazycích se text (string) vkládá do dvojitých uvozovek, zatímco znak (char) do jednoduchých. V PHP i jiných dynamicky typovaných jazycích se ovšem string může udávat v jednoduchých i složených uvozovkách.

Rozdíl v uvozovkách

V PHP v jednoduchých uvozovkách 'text' nelze používat escape sekvence. Jediné, které fungují, jsou \\ a \'. Všechno ostatní bude ignorované a vypíše se, jak je psáno. Rovněž proměnné nebudou nahrazeny jejich obsahem, ale bude vypsána s dolarem a jménem.

Složené uvozovky naopak nahrazují veškeré proměnné a veškeré escape sekvence. Pokud v textu zahrnu název proměnné, bude nahrazena jejím  obsahem. Kompletní výpis escape sekvencí najdete v dokumentace na PHP.net.

Příklad

$i = 73;
$s = "Pavel";
$a = [8 => "hodnota"];

//------------------------------------
//         Jednoduché uvozovky
//------------------------------------

echo 'Ignorují \n escape sekvence kromě \' a \\ ';
//Vypíše: Ignorují \n escape sekvence kromě ' a \

echo 'Ale ignorují $i "proměnné" a vypíšou {$a[8]} \$s vše';
//Vypíše: Ale ignorují $i "proměnné" a vypíšou {$a[8]} \$s vše


//------------------------------------
//          Složené uvozovky
//------------------------------------

echo "Neignorují \n žádné \100 'escape sekvence' \$ ";
//Vypíše: Neignorují žádné @ 'escape sekvence' $

echo "A proměnné $i nahradí \$s obsahem {$a[8]} a vypíšou $s - \xA9";
//Vypíše: A proměnné 73 nahradí $s obsahem hodnota a vypíšou Pavel - ©

Mé první setkání při regulárních výrazech

S jiných chováním jsem se prvně setkal při psaní regulárních výrazů. Potřeboval jsem hledat znak dolar, proto jsem napsal do patternu \$. PHP preprocesor toto však nahradil ještě dříve, než řetězec vstoupil do funkce preg_match. Proto je nutné buď využít jednoduché uvozovky, nebo dvojtou escape sekvenci \\\$.


Pokud jste seznámeni s tímto chováním, problém asi mít nebudete. Ale než jsem na toto přišel, hodně krát jsem se podivoval, proč mi mé kódy nefungují. Snad vám to ulehčí práci a nebudete tápat jak já!

K tomuto článku již není možné přidávat další komentáře