niedziela, 31 maja 2015

[PHP] Kiedy cudzysłów, a kiedy apostrof

TRUE
3673455057687492124
...czyli różnica pomiędzy cudzysłowem, a apostrofem.

W PHP, jak i we właściwie każdym języku wszelkie zmienne typu string obejmować musimy w cudzysłowy, lub apostrofy. Mamy tutaj dowolność, jeśli chodzi o wybór - obie formy są poprawne, byleby znak otwierający zgadzał się ze znakiem kończącym. Na pierwszy rzut oka używanie cudzysłowów albo apostrofów nie różni się od siebie działaniem. Różnica jednak jest, o czym wiele osób - szczególnie początkujących nie ma pojęcia. Różnica jest w sposobie interpretacji zawartości objętej cudzysłowem/apostrofem jak i co za tym idzie - w szybkości przetwarzania kodu przez interpreter.

Pisząc kod zawsze powinniśmy starać się o to, aby był on jak najprostszy i jak najszybciej kompilowany przez interpreter. Te malutkie z pozoru różnice w czasie wykonywania kodu urastają do trochę większych, gdy serwer musi obsłużyć takich wykonań tysiące i ma ku temu ograniczone zasoby. Trzeba o tym pamiętać. Wróćmy zatem do tematu o jakim jest ten tekst.

Popatrzmy na przykład poniżej. Z pozoru obie linijki kodu nie różnią się niczym i wykonają się tak samo, ale jak to mówią - pozory mylą.
[code]
<?php
$zmienna1 = "jakiś tekst";
$zmienna2 = 'jakiś tekst';
?>[/code]
Dla człowieka niby tak samo, a jednak dla interpretera PHP zupełnie inaczej. Na czym więc polega różnica w obu zapisach (poza faktem wizualnym oczywiście)? Otóż polega ona na tym w jaki sposób PHP traktuje taki ciąg znaków. Aby bardziej zobrazować sobie to na przykładzie, popatrzmy na poniższe:
[code]
<?php
$kolor = 'czerwony';
$str1 = "Mój ulubiony kolor to: $kolor";
$str2 = 'Mój ulubiony kolor to: $kolor';
echo $str1 . '<br />';
echo $str2;

/*
Wynik:
Mój ulubiony kolor to: czerwony
Mój ulubiony kolor to: $kolor
*/
?>[/code]
Jak widać wyświetlenie zmiennej $str1 i $str2 daje zupełnie inne wyniki. Powodem jest fakt, iż ciągi objęte w cudzysłowy ( " ) są przez PHP interpretowane, natomiast ciągi objęte w apostrofy ( ' ) już nie. Ciąg objęty w cudzysłowy musi być zatem przez PHP przeparsowany i przetworzony w celu m.in. podstawienia wartości ewentualnie występujących w nim zmiennych, co za tym idzie - jest to jakieś dodatkowe zadanie dla procesora.

Ciąg natomiast objęty w apostrofy jest z marszu traktowany jako zwykły, najzwyklejszy tekst i nie jest w żaden sposób przetwarzany, co za tym idzie - jest "obrabiany" przez PHP o wiele szybciej. Różnicę zauważymy też m.in. w przetwarzaniu znaków specjalnych, jak np. znak końca linii:
[code]
<?php
$str1 = "To jest pierwsza linia.\nTo jest druga linia.";
$str2 = 'To jest pierwsza linia.\nTo jest druga linia.';
?>[/code]
Wyświetlenie teraz zmiennej $str1 pokaże nam:
[code]
To jest pierwsza linia.
To jest druga linia.[/code]

Natomiast wyświetlenie drugiej zmiennej - $str2 pokaże:
[code]To jest pierwsza linia.\nTo jest druga linia.[/code]
W drugim przypadku znak \n nie zostanie w żaden sposób przetworzony na znak końca linii i potraktowany "na surowo".

Trzeba mieć też świadomość, że ciąg objęty w cudzysłowy jest przetwarzany przez PHP nawet wtedy, gdy nie ma w nim żadnych zmiennych, ani żadnych znaków specjalnych (trzeba przecież przeparsować wszystko, aby sprawdzić czy takowe nie występują). Jest to obciążenie dla interpretera i powinno się tego unikać. Pamiętajmy zatem więc, żeby zawsze wszędzie tam, gdzie nie ma konieczności używania cudzysłowów (a czasem taka potrzeba jest) używać zwykłych apostrofów.

5 komentarzy:

  1. A mógłbyś napisać coś o różnicy w szybkości (jeśli takowa istnieje) pomiędzy echo "Mój ulubiony kolor to $kolor"; a echo 'Mój ulubiony kolor to ' . $kolor; (użycie konkatenacji)? Domyślam się, że konkatencja może być wolniejsza, bo to jakby działanie dodawania, w którym parser musi skonwertować typ zmiennej na string (jeśli nie jest ona stringiem). Spotkałem się jeszcze z przecinkiem zamiast kropki, to trochę tak, jakby echo przyjmowało jakieś argumenty. Mógłbyś wspomnieć także o takim zapisie (z klamrami — czy są one użyte tylko do dekoracji?): echo "Mój ulubiony kolor to {$kolor}";?

    OdpowiedzUsuń
    Odpowiedzi
    1. To są właściwie różnice milisekundowe, ale przy milionach odwiedzin trzeba optymalizować wszystko. Wyłączanie zmiennej poza string całkowicie odciąża parser od podstawiania wartości zmiennej - jakby nie patrzeć jest to jedno małe obciążenie mniej. Różnica niezauważalna gołym okiem, ale zawsze. Poza tym kod jest ładniejszy. Nawiasy klamrowe tutaj niczego nie zmieniają.

      Usuń
    2. Dobra, a w php spotyka się też coś takiego, że mamy jakieś zmienne, np. $zmienna1 i $zmienna2, i chcemy je wyświetlić. Czemu w takich sytuacjach pisze się
      "
      echo $zmienna1 i potem br w cudzysłowiu
      echo $zmienna2;

      zamiast
      echo $zmienna1 i znacznik br bez cudzysłowia
      ;
      echo $zmienna2;

      "
      ? :)

      Usuń
  2. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  3. 58 yrs old VP Quality Control Aurelie Newhouse, hailing from North Vancouver enjoys watching movies like "Out of Towners, The" and Coffee roasting. Took a trip to Sacred City of Caral-Supe Inner City and Harbour and drives a MR2. strona

    OdpowiedzUsuń

Masz sugestię? Znalazłeś błąd? Napisz komentarz! :)

webmaester.pl - profesjonalne projektowanie WWW i webaplikacji
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji