MareX WeBlog

PHP výuka - řetězce

REKLAMA

Řetězce budete v PHP používat asi dost často, proto jim věnujeme jeden zvláštní článek.

Ukážeme si, jak se takový řetězec zapisuje:

<?php
$promenna1 = "Toto je řetězec";
$promenna2 = 'Toto je také řetězec';
?>

Jak vidíte, řetězce se vkládají do uvozovek nebo apostrofů. Jaký je mezi těmito dvěma zápisy rozdíl? V podstatě žádný, oba jsou prostě řetězce. Ale nějaký rozdíl tam přeci jen je:

<?php
$promenna1 = "Toto je "nějaký" řetězec"; // CHYBA
$promenna2 = "Toto je 'nějaký' řetězec"; // v pořádku
$promenna3 = 'Toto je 'nějaký' řetězec'; // CHYBA
$promenna4 = 'Toto je "nějaký" řetězec'; // v pořádku
?>

Jak jste si jistě všimli, slovo nějaký v řetězci, který jsme vložili do proměnné $promenna1 a $promenna3, je jinou barvou. Je to proto, že toto slovo není považováno za řetězec. Jak to? No jednoduše: PHP parser najde například první uvozovky a tam pro něj začíná řetězec. Pak tedy hledá další uvozovky a tam pro něj zase řetězec končí a na dalších uvozovkách začíná další řetězec… atd. Tyto dva řetězce by tedy s největší pravděpodobností generovaly nějaké chybové hlášení.

Naproti tomu řetězce v proměnných $promenna2 a $promenna4 jsou naprosto v pořádku. V řetězci uzavřeném v uvozovkách můžeme libovolně používat apostrofy a stejně tak v řetězcích uzavřených v apostrofech můžeme libovolně používat uvozovky.

Únikové sekvence

Co když ale budeme potřebovat v řetězci, který bude uzavřen do uvozovek použít uvozovky, nebo v řetězci v apstrofech použít apostrof? I to je samozřejmě možné díky tzv. únikovým sekvencím:

<?php
$promenna1 = "Toto je \"nějaký\" řetězec"; // oba tyto řetězce jsou
$promenna3 = 'Toto je \'nějaký\' řetězec'; // v pořádku
?>

Řetězce v obou proměnných jsou v pořádku, protože před uvozovkami (apostrofy) uvnitř řetězce jsou vložena zpětná lomítka. To je ona úniková sekvence. Pro parser to znamená, že tyto uvozovky nemá považovat za ukončení řetězce, ale že mají být vypsány jako součást tohoto řetězce.

Nyní si ukážeme únikové sekvence fungující v řetězci v uvozovkách:

\“uvozovky
\\zpětné lomítko
\$znak dolaru
\nnový řádek
\rnávrat vozíku
\ttabulátor

Ještě existují další dva:

např. \012 – je oktalové (osmičkové) číslo a

např. \xff – je hexadecimální (šestnáctkové) číslo
Jak vidíte, pomocí únikových sekvencí můžete do textu jednoduše vložit odřádkování apod. Stejně tak musíte zpětné lomítko před znak dolaru, protože jak už víte, tento znak označuje v PHP název proměnné.
Několik ukázek na lepší pochopení:

<?php
// vypíše: Toto je "nějaký" řetězec
echo "Toto je \"nějaký\" řetězec";

/* vypíše: Toto je
nějaký řetězec */
echo "Toto je\nnějaký řetězec";

$promenna = "nějaký";

// vypíše: Toto je $promenna řetězec
echo "Toto je \$promenna řetězec";

// vypíše: Toto je nějaký řetězec
echo "Toto je $promenna řetězec";
?>

V posledním případě byla $promenna nahrazena svým obsahem, protože před znakem dolaru není zpětné lomítko.
Ovšem v následujících případech nebude zápis fungovat podle očekávání:

<?php
$promenna = "nějaký ";
// vypíše: Toto je
echo "Toto je $promennatext";
?>

Proč?! Protože za názvem proměnné musí následovat nějaký znak, který se nesmí používat v názvech proměnných. V tomhle případě si PHP myslí, že chcete vypsat proměnnou s názvem $promennatext, jenže ta neexistuje, je tedy nahrazena prázdným řetězcem (v případě, že byste měli zapnuté chyby typu E_NOTICE, tak zároveň vygeneruje chybové hlášení, že proměnná není definována).
Jinak je tomu v řetězcích uzavřených v apostrofech. Tam se totiž používá pouze zpětné lomítko před apostrofem, aby nebyl považován za ukončení řetězce. Ostatní nebudou fungovat tak jako v předchozích příkladech.

Ukázka:

<?php
// vypíše: Toto je 'nějaký' řetězec
echo 'Toto je \'nějaký\' řetězec';

// vypíše: Toto je\nnějaký řetězec
echo 'Toto je\nnějaký řetězec';

$promenna = "nějaký";

// vypíše: Toto je $promenna řetězec
echo 'Toto je \$promenna řetězec';

// vypíše: Toto je $promenna řetězec
echo 'Toto je $promenna řetězec';
?>

Proměnné nejsou nahrazovány svým obsahem, ale jsou vypsány na obrazovku, jako součást textu.

Vkládání proměnných a polí do řetězců

Ukážeme si, jak tedy správně vkládat do řetězců obsah proměnných a polí:

<?php
$adresa = "blog.marextafl.cz";

// SPRÁVNĚ - vypíše: Jsme na stránkách blog.marextafl.cz.
echo "Jsme na stránkách $adresa.";

// SPRÁVNĚ - vypíše: Jsme na stránkách blog.marextafl.cz.
echo "Jsme na stránkách {$adresa}.";

// SPRÁVNĚ - ale vypíše: Jsme na stránkách { blog.marextafl.cz}.
echo "Jsme na stránkách { $adresa}.";

// SPRÁVNĚ - vypíše: Jsme na stránkách blog.marextafl.cz.
echo "Jsme na stránkách ${adresa}.";
?>

Takže s proměnnými je to vcelku jednoduché. Co se týká polí, je to poněkud složitější. Nemůžete totiž napsat toto:

<?php
$adresa = Array("marextafl" => "blog.marextafl.cz", "banan" => "www.banan.cz");
echo "Jsme na stránkách $adresa["marextafl"].";
?>

Nemůžeme totiž použít uvozovky, protože dojde k neočekávanému ukončení řetězce a skript skončí s chybovým hlášením.

Bohužel, ale nebude fungovat ani tento zápis:

<?php
echo "Jsme na stránkách $adresa['marextafl'].";
?>

Ovšem, bude nám fungovat toto:

<?php
echo "Jsme na stránkách $adresa[marextafl].";
?>

marextafl je totiž vyhodnocen jako neznámá konstanta. Protože konstanta tohoto jména neexistuje, vyhodnotí se jako „marextafl“, a tím dojde k vyhodnocení toho zápisu jako $adresa["marextafl"]. Ale zase, pokud byste měli definovanou konstantu jménem marextafl, tak by došlo k nahrazení obsahem této konstanty.

Takže asi nejbezpečnější zápis by v tomto případě byl:

<?php
echo "Jsme na stránkách {$adresa['marextafl']}.";
// SPRÁVNĚ - vypíše: Jsme na stránkách blog.marextafl.cz.
?>

Tento zápis je naprosto v pořádku a měl by vždy fungovat.
Ještě existuje další způsob a tím je spojování řetězců.

Spojování řetězců

Pro spojování více řetězců v jeden slouží operátor tečka.

<?php
$modra = "dobrá";
echo "Modrá je ".$modra."!";
// vypíše: Modrá je dobrá!
// stejně jako:
echo "Modrá je $modra!";
?>

Pomocí tečky jsme spojili v jeden řetězec tři samostatné řetězce:

1.) Modrá je

2.) dobrá – tento byl uložen v proměnné $modra

3.) !

Takto spojovat můžete samostatné řetězce, proměnné, pole i konstanty. Všechny následující zápisy jsou naprosto v pořádku:

<?php
$adresa = Array("marextafl" => "blog.marextafl.cz", "banan" => "www.banan.cz");
$jmeno = Array("Marku", "Pepo");
$uvitani = "Vítejte na stránkách ";

// všechny následující ukázky vypíší:
// Vítejte na stránkách blog.marextafl.cz, Marku.
echo $uvitani.$adresa["marextafl"].", ".$jmeno[0];

echo "Vítejte na stránkách ".$adresa["marextafl"].", ".$jmeno[0];

echo "$uvitani {$adresa['marextafl']}, {$jmeno[0]}";
?>

Syntaxe HEREDOC

Ještě existuje jeden velmi zvláštní způsob zápisu řetězců a tím je syntaxe HEREDOC. Je to text uzavřený mezi <<<identifikátoridentifikátor.

identifikátor je libovolný text, který se nesmí vyskytovat v samotném řetězci.

Ukázka:

<?php
$promenna = 2;
echo <<<RETEZEC
Tento text je vypsán pomocí syntaxe HEREDOC.
Je zde možno používat konce řádků, "uvozovky" i
'apostrofy', samozřejmě i vypisovat proměnné:
\$promenna = $promenna
a také lze používat únikové sekvence.\nZajímavé, ne?!
RETEZEC;
?>

Tento příklad by vypsal:

Tento text je vypsán pomocí syntaxe HEREDOC.
Je zde možno používat konce řádků, „uvozovky“ i
‘apostrofy’, samozřejmě i vypisovat proměnné:
$promenna = 2
a také lze používat únikové sekvence.
Zajímavé, ne?!

Podmínkou správného zpracování takového zápisu je, jak již bylo řečeno, že identifikátor se nesmí vyskytovat nikde v samotném řetězci a dále na řádku, kde je ukončovací identifikátor se nesmí vyskytovat nic jiného, maximálně středník jako ukončení příkazu. Žádné mezery, tabulátory a podobně (nesmí být odsazen od levého okraje).
O řetězcích, zdá se, jsme si řekli vše. Příště budeme pokračovat operátory.

REKLAMA

PHP výuka - řetězce