Apostrofy, uvozovky a escape

Dříve jsme si řekli, že apostrofy a uvozovky se v použití trochu liší, zejména u příkazů echo a funkce print(). V první řadě je třeba dodržet posloupnost těchto znaků. Je lepší předávat příkazu echo řetězce uzavřené v apostrofech, přičemž tyto řetězce budou obsahovat uvozovky. Je možné to udělat i naopak, ale je to méně efektivní, neboť PHP s řetězcem uvnitř uvozovek nakládá složitěji, o tom ale až dále.

Nyní si připomene, jak se vyvarovat chybám s vnořenými apostrofy či uvozovkami.

<?php

  
/* Apostrofy */

  // echo 'I'd like to tell you: "You're the most interesting man I've ever met."';
  // Toto by bylo špatně.

  
echo 'I\'d like to tell you: "You\'re the most interesting man I\'ve ever met."';
  
// Toto je správně.


  /* Uvozovky */

  // echo "I'd like to tell you: "You're the most interesting man I've ever met."";
  // Toto by bylo špatně.

  
echo "I'd like to tell you: \"You're the most interesting man I've ever met.\"";
  
// Toto je správně.

?>

Zpětné lomítko, neboli escape se používá pro uvození znaků, které mají v PHP speciální význam. Zpětné lomítko znamená, že tento znak má být považován za literární znak, nikoliv speciální symbol. Sekvenci \' nebo \" můžeme tedy použít pro prezentaci apostrofu či uvozovek uvnitř řetězce.

Použití apostrofů či uvozovek má také vliv na to, jak bude PHP s předaným řetězcem nakládat. Určitě jste si všimli, že jsme při vypisování řetězců zatím nepoužili odřádkování. V řetězci mezi apostrofy či uvozovkami můžete odřádkovat enterem, vše se promítne do HTML kódu. Zde si ale dovolím upozornit, že není odřádkování jako odřádkování, operační systémy Windows, Linux i Mac totiž pro nový řádek používají odlišné sekvence.

Operační systém Sekvence
Windows \r\n
Linux \n
Mac OS \r

Pokud pracujete na Windows, měli byste ve vašem editoru mít vždy nastaveno jeho odřádkování, ušetří vám to spoustu problémů. Například v PSPadu se řádkování vybere z hlavního menu > Formát. Úplně dole pod výběrem kódování (Windows-1250, ISO-8859-2, UTF-8 ...) zaškrtněte volbu DOS (CR+LF). Místo odřádkování enterem uvnitř řetězce je však mnohdy lepší pro znak nového řádku v PHP použít danou escape sekvenci. Avšak pozor, tato sekvence se převede na odřádkování pouze v případě, že je vypsána v uvozovkách.

<?php

  
echo 'řádek 1<br>\r\nřádek 2<br>\r\nřádek3';
  
/*
    Vypíše \r\n literárně:

    řádek 1<br>\r\nřádek 2<br>\r\nřádek3
  */

  
echo "řádek 1<br>\r\nřádek 2<br>\r\nřádek 3";
  
/*
    Sekvence \r\n je převedena na odřádkování:

    řádek 1<br>
    řádek 2<br>
    řádek 3
  */

?>

Nejefektivnější řešení je ale nadefinovat si sekvenci pro odřádkování jako konstantu. To už umíme z předešlého dílu. I zde bude nutné zapsat sekvenci do uvozovek.

<?php

  define
('NL'"\r\n");

  echo 
'řádek 1'NL;
  echo 
'řádek 2';
  echo 
NL;
  echo 
'řádek 3';

?>

Stejnou substituci provádí PHP v případě proměnných uvnitř uvozovek. Tato substituce se nazývá expanzí proměnné. Porovnejte následující zápisy:

<?php

  $Jmeno 
'Tereza';

  echo 
'Jmenuji se $Jmeno.';
  
// Vypíše: Jmenuji se $Jmeno.

  
echo "Jmenuji se $Jmeno.";
  
// Vypíše: Jmenuji se Tereza.

?>

Druhý zápis se může jevit jako lepší, ale existují důvody, proč ho nepoužívat, pokud není vyloženě potřeba. Jednak tento proces substituce mnohonásobně více zatěžuje skript, a jednak může nastat doba, kdy nebudete chtít tuto substituci v uvozovkách využít. Ale to se dá jednoduše ošetřit zpětným lomítkem.

<?php

  $Jmeno 
'Tereza';

  echo 
"Obsah proměnné \$Jmeno je $Jmeno";
  
// Vypíše: Obsah proměnné $Jmeno je Tereza

  // Poněkud lepší řešení:
  
echo 'Obsah proměnné $Jmeno je '$Jmeno;

?>

První výskyt proměnné $Jmeno je uvozen zpětným lomítkem, takže se vypíše literárně "$Jmeno". Druhý výskyt již zpětným lomítkem uvozen není, takže je proměnná $Jmeno nahrazena svým obsahem. V tomto případě "Tereza".

 

« Obsah učebnice