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ą.
- <?php
- $zmienna1 = "jakiś tekst";
- $zmienna2 = 'jakiś tekst';
- ?>
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:
- <?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
- */
- ?>
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:
- <?php
- $str1 = "To jest pierwsza linia.\nTo jest druga linia.";
- $str2 = 'To jest pierwsza linia.\nTo jest druga linia.';
- ?>
Wyświetlenie teraz zmiennej $str1 pokaże nam:
- To jest pierwsza linia.
- To jest druga linia.
Natomiast wyświetlenie drugiej zmiennej - $str2 pokaże:
- To jest pierwsza linia.\nTo jest druga linia.
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.
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ń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ń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ę
Usuń"
echo $zmienna1 i potem br w cudzysłowiu
echo $zmienna2;
zamiast
echo $zmienna1 i znacznik br bez cudzysłowia
;
echo $zmienna2;
"
? :)
Ten komentarz został usunięty przez autora.
OdpowiedzUsuń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ń