PHP - 11. díl – psaní řetězců pod lupou

Dnešní díl PHP bude věnován detailnějšímu pojednání o textových řetězcích.

Do této chvíle jsem všechny textové řetězce uzavíral do dvojitých uvozovek, například "Ahoj". Ovšem to není v PHP jediná možnost. Proto v následujících kapitolách proberu další možnosti. Možnosti zápisu budou rozebrány i z hlediska jejich dalších možností.

V zásadě jsou tři možné způsoby, jak psát textové řetězce. První možnost je uzavřít řetězec do apostrofů, jako například: `Jak se máš?`. Druhá možnost je uzavřít řetězec do uvozovek, jak jsme to zatím psali všude, například "Jak se máš?". A třetí možnost nazývaná v dokumentaci heredoc syntaxe je trochu komplikovanější, povíme si o ní na konci.

Řetězce uzavřené v apostrofech

Řetězce uzavřené v apostrofech jsou nejjednodušší možné řetězce. Jak poznáte porovnáním dále, jsou řetězce uzavřené v apostrofech ty nejjednodušší, které toho tolik neumějí. Jejich výhodou je, že jsou to prostě řetězce ve své nejčistější podobě. A pokud nebudete chtít různé ty serepetičky, které, jak poznáte později, jsou navěšeny na řetězcích uzavřených uvozovkách, budete dávat přednost řetězcům v apostrofech.

Protože řetězce v apostrofech jsou ty nejjednodušší, a PHP k nim nic dalšího nepřidává, měly by teoreticky být i mírně rychlejší při zpracování, než další způsoby zápisů řetězců. Používejte proto uvozovky uzavřené v apostrofech přednostně před dalšími způsoby.

Pokud byste chtěli napsat jako součást řetězce uzavřeného v apostrofech přímo znak apostrof, je to také možné. Prostě namísto jednoho znaku apostrof napíšete dovnitř dva znaky \`, tedy zpětné lomítko a pak samotný apostrof. Viz následující jednoduchý příklad:

<html>
<head>
<title>Příklad 1. z 11. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  echo `Takhle se vypisuje apostrof: \`.`;
?>
</body>
</html>

Jak je vidět, i apostrof se dá vypsat. Ještě speciální způsob má samotný znak zpětné lomítko \. Pokud chcete napsat zpětné lomítko, je dobré ho zdvojit. Tedy napíšete-li dvakrát za sebou zpětné lomítko takto: \\, ve skutečnosti jste vložili jen jedno:

<html>
<head>
<title>Příklad 2. z 11. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  echo `Tohle je jedno zpětné lomítko: \\.`;
  echo `Tohle jsou dvě zpětná lomítka: \\\\.`;
?>
</body>
</html>

Těmto dvojicím znaků, které začínají zpětným lomítkem \ se říká escape sekvence.

Nic jiného se s řetězcem uzavřeným v apostrofech neděje. Pokud tedy nemáte s textovým řetězcem další záměry, dejte mu přednost.

Řetězce uzavřené v uvozovkách - expanze proměnných

Řetězce, které jsou uzavřené v uvozovkách jsou daleko prošpikovanější nejrůznější přidanou hodnotou. To na jedné straně může být velmi příjemné, na druhé straně v některých případech bude těžké ohlídat všechny možnosti.

Základním rozšířením jsou tzv. expanze proměnných. Pokud dovnitř řetězce napíšeme název proměnné začínající dolarem, pak se dovnitř řetězce vloží hodnota proměnné. Viz třeba tento malý příklad:

<html>
<head>
<title>Příklad 3. z 11. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  $jmeno = "Pavel";
  $napoj = "pivo";
  echo "$jmeno je dobrý kamarád!<br>";
  echo "$jmeno pije $napoj.<br>";
?>
</body>
</html>

Pokud si příklad vyzkoušíte, zjistíte, že namísto řádky

echo "$jmeno je dobrý kamarád!<br>";

bude vypsáno "Pavel je dobrý kamarád!", protože PHP si za $jmeno dosadil proměnnou $jmeno, která má hodnotu "Pavel". Obdobně:

echo "$jmeno pije $napoj.<br>";

se vypíše jako "Pavel pije pivo.", protože zde dojde k expanzi dvou proměnných, a to proměnné $jmeno, která má hodnotu "Pavel" a proměnné $napoj, která má hodnotu "pivo".

Expanze proměnných je celkem užitečná věc v mnoha případech, je třeba počítat s tím, že PHP se snaží vytvořit co nejdelší jméno proměnné, kterou nahrazuje. Takže třeba následující příklad selže:

<html>
<head>
<title>Příklad 4. z 11. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  $napoj = "šaratice";
  echo "Pavel pije $napoje.<br>";
?>
</body>
</html>

V tomto příkladu mám proměnnou $napoj, ale v řetězci se hledá proměnná $napoje. Výsledkem je, že proměnnou $napoje nenajde. Což v některých případech může skončit i anglickým hlášením o chybějící proměnné. Každopádně jsme Pavla od šaratice zachránili. A jak to má vypadat správně, aby se doplnila proměnná $napoj? Takto (máte hned dvě možnosti, jak to napravit):

<html>
<head>
<title>Příklad 5. z 11. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  $napoj = "šaratice";
  echo "Pavel pije {$napoj}e.<br>";
  echo "Pavel pije ${napoj}e.<br>";
?>
</body>
</html>

Jak je vidět ve výše uvedeném příkladu, je v takovém případě potřeba do složených závorek { a } oddělit tu část jména proměnné, která je platná. Dolar, který předchází jménu proměnné můžeme napsat dovnitř složené závorky, a nebo před ní, jak chcete. Vyjde vám jen neobvyklý řetězec "Pavel pije šaraticee", což je v češtině špatně, ale berte to jako příklad na funkčnost.

Složené závorky { a } se dají použít i tehdy, pokud chci vypsat proměnnou, která je součástí pole jako třeba v následujícím příkladu, který využije předdefinovanou proměnnou. Příklad vypíše informace o Vašem prohlížeči:

<html>
<head>
<title>Příklad 6. z 11. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  echo "Informace o prohlížeči: {$_SERVER[`HTTP_USER_AGENT`]}.";
?>
</body>
</html>

Řetězce uzavřené v uvozovkách - escape sekvence

Protože se tvůrci PHP snažili, aby pomocí řetězců uzavřených v uvozovkách šly napsat opravdu všechny znaky, vytvořily se tzv. escape sekvence. Což jsou sekvence znaků, které začínají znakem zpětné lomítko \, a které nám umožňují zapsat opravdu všechny znaky. Pro zapsání zpětného lomítka napíšeme dvě zpětná lomítka za sebou \\. Pro zapsání samotných uvozovek napíšeme \", pro zapsání dolaru napíšeme \$. Řetězce v dvojitých uvozovkách umí také \n pro znak nového řádku (LF), \r pro návrat vozíku (CR) a \t pro tabelátor:

<html>
<head>
<title>Příklad 7. z 11. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  echo "Toto jsou uvozovky \".<br>";
  echo "Toto je zpětné lomítko \\.<br>";
  echo "A toto je znak dolar \$.<br>";
?>
</body>
</html>

Užitečné také je zapsání znaku v hexadecimální notaci. Zapíše se tak, že napíšu dvojici znaků \x a pokračuji jedním, nebo dvěma hexadecimálními číslicemi. Pokud nechápete, co je to hexadecimální notace, tak tento odstavec přeskočte. Například mezeru můžu napsat jako \x20 v hexadecimální notaci.

Heredoc syntaxe

Heredoc syntaxe je užitečná u skutečně dlouhých řetězců. Rovnou uvedu jeden příklad:

<html>
<head>
<title>Příklad 8. z 11. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
echo <<<QQQ
Nějaký dlouhý text, který potřebujete napsat jako jeden řetězec
je možné napsat v here doc syntaxi. Uvnitř tohoto řetězce můžete
používat vše, na co jste zvyklí z řetězců uzavřených v uvozovkách,
tedy i expanzi proměnných a escape sekvence.
QQQ;
?>
</body>
</html>

Heredoc syntaxe začíná <<< a za ním nějakým textem. V našem případě jsem zvolil QQQ, důležité je, že stejným textem QQQ řetězec i skončí. Můžete samozřejmě použít cokoli jiného namísto QQQ, důležité je, aby se ten text nevyskytoval uvnitř řetězce. Mezitím je dlouhý text, který je rozdělený na několik řádek.

Samotná heredoc syntaxe má všechny možnosti, které má řetězec uzavřený v uvozovkách, tedy i expanzi proměnných a také escape sekvence.

Závěr: Kdy používat který zápis?

Pokud bych měl shrnout, kdy doporučuji který zápis, napsal bych to asi takto. Pokud nečekám expanzi proměnných a nepotřebuji některé speciální znaky, uzavírám řetězce do apostrofů. Z hlediska HTML a XHTML značkách jsou řetězce zapsané v apostrofech i jednodušší a čitelnější.

Pokud potřebuji expanzi proměnných, uzavírám znaky do uvozovek.

Co se týká heredoc syntaxe, tu používám u skutečně dlouhých řetězců.

Diskuze (23) Další článek: Další mail nabízející 1 GB prostoru

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,