PHP - konkatenuje lub bezpośrednio wstawia zmienne do łańcucha

224

Zastanawiam się, jaki jest właściwy sposób wstawiania zmiennych PHP do łańcucha?

Tą drogą:

echo "Welcome ".$name."!"

Lub w ten sposób:

echo "Welcome $name!"

Obie te metody działają w moim przypadku PHP v5.3.5. Ta ostatnia jest krótsza i prostsza, ale nie jestem pewien, czy ta pierwsza jest lepsza do formatowania czy zaakceptowana jako bardziej odpowiednia.

Projektant stron internetowych
źródło
18
jeśli robisz pierwszy, osobiście wolę pojedynczy cytatecho 'Welcome '.$name.'!';
KJYe.Name 葉家仁
1
php.net/manual/en/…
Dejan Marjanovic
2
@ kjy112 Powiedziałem to samo w mojej odpowiedzi, jestem OGROMNYM fanem pojedynczych cytatów: X
Khez 9'11
11
Osobiście ignoruję całe „pojedyncze cytaty są bardziej wydajne” i po prostu wybieram „użyj dowolnego stylu cytowania, który wymaga ostatniej ucieczki wewnętrznej”. Jest wysoce nieprawdopodobne, aby jakikolwiek kod, który napiszesz, skorzystałby z jakichkolwiek korzyści MIKROSKOPOWYCH z powodu mniejszej analizy składniowej w porównaniu do zwiększonej konkatenacji ciągów.
Marc B,
1
Roszczenie dotyczące utraty wydajności jest fałszywe. Zobacz ten artykuł jako odniesienie: nikic.github.io/2012/01/09/…
Damian

Odpowiedzi:

344

Pomiędzy tymi dwiema składniami powinieneś naprawdę wybrać tę, którą wolisz :-)

Osobiście wybrałbym twoje drugie rozwiązanie w takim przypadku (interpolacja zmienna) , które łatwiej mi zarówno pisać, jak i czytać.

Wynik będzie taki sam; i nawet jeśli występują implikacje dotyczące wydajności, nie będą miały znaczenia 1 .


Jako sidenote, więc moja odpowiedź jest nieco bardziej kompletna: dzień, w którym będziesz chciał zrobić coś takiego:

echo "Welcome $names!";

PHP zinterpretuje kod tak, jakbyś próbował użyć $nameszmiennej - która nie istnieje. - zwróć uwagę, że zadziała tylko wtedy, gdy użyjesz „” not ”dla swojego łańcucha.

Tego dnia musisz użyć {}:

echo "Welcome {$name}s!"

Nie trzeba wracać do konkatenacji.


Zauważ też, że twoja pierwsza składnia:

echo "Welcome ".$name."!";

Prawdopodobnie można go zoptymalizować , unikając konkatenacji, używając:

echo "Welcome ", $name, "!";

(Ale, jak powiedziałem wcześniej, nie ma to większego znaczenia ...)


1 - Chyba że robisz setki tysięcy konkatenacji kontra interpolacje - i prawdopodobnie nie jest tak do końca.

Pascal MARTIN
źródło
3
Wspaniale, dziękuję! bardzo miło wiedzieć, że mogę użyć mojej ulubionej metody wstawiania jej bezpośrednio do łańcucha i jestem bardzo wdzięczny za to, że teraz wiem, jak oddzielić zmienną od reszty żądła, jeśli zajdzie taka potrzeba {}.
Web_Designer
64
Tylko uwaga, że ​​oddzielanie literałów łańcuchowych i zmiennych przecinkami działa tylko z echo, ale nigdzie indziej.
colincameron
3
Po prostu wskazując na wydajność: time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = $string.$i; } print("Done!\n");'(konkatenacja) faktycznie traci około 300 milisekund (dla 200 000 przedmiotów, to 1 miliseconf na tysiąc elementów w zestawie ...). To szum statystyczny, nie można nawet zmierzyć żadnej różnicy. Biorąc pod uwagę, że jest bardziej czytelny, time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = "{$string}{$i}"; } print("Done!\n");'(Interpolacja) jest niekwestionowanym zwycięzcą ...
Fernando Cordeiro,
1
Jeśli chcesz użyć interpolacji, musisz użyć podwójnych cudzysłowów.
Máxima Alekz,
czy można używać funkcji wewnątrz ciągu? jak echo "This is {foo ()} nice"; ?
strix25,
17

Ciągi cudzysłowów są bardziej eleganckie, ponieważ nie trzeba ich rozbijać za każdym razem, gdy trzeba wstawić zmienną (tak jak w przypadku ciągów cudzysłowów).

Jeśli jednak musisz wstawić wartość zwracaną przez funkcję, nie można jej wstawić do ciągu podwójnego cudzysłowu - nawet jeśli otoczysz ją nawiasami klamrowymi!

//syntax error!!
//$s = "Hello {trim($world)}!"

//the only option
$s = "Hello " . trim($world) . "!";
Michael
źródło
10
Możesz wstawiać funkcje pośrednio do ciągów poprzez funkcje zmienne PHP 5.3. $x = function() { ...}; $string = "hello {$x(blah blah blah)}", która działa wokół „ograniczenia”.
Marc B,
5
@Marc Fajnie, nie wiedziałem o tym! Możesz także przypisać nazwę istniejącej funkcji do zmiennej i zrobić to samo:$x = 'trim'; $string = "hello {$x('blah blah blah')}";
Michael
3
to fajne, ale wyjątkowo nieczytelne, więc i tak trzeba tego unikać.
Twój zdrowy rozsądek,
2
$s = 'Hello ' . trim($world) .'!';Spróbuj użyć pojedynczych cudzysłowów, gdy nie ma nic do interpolacji w ciągu. Poprawi to wydajność i może być użyte jako konwencja do identyfikacji obu
Sarath Sadasivan Pillai
9

Od php4 możesz używać formatera ciągów znaków:

$num = 5;
$word = 'banana';
$format = 'can you say %d times the word %s';
echo sprintf($format, $num, $word);

Źródło: sprintf ()

Olivier Royo
źródło
Zdecydowanie najbezpieczniejsza opcja. +1 za dobrą praktykę i ogólną konwencję pasującą do innych języków
Javier Arias
6

Każdy z nich jest w porządku. Użyj tego, który ma dla Ciebie lepszą widoczność. Mówiąc o widoczności, możesz także sprawdzić printf .

Manos Dilaverakis
źródło
5

Z punktu widzenia tworzenia myśli jest proste , czytelne , spójne i łatwe do zrozumienia (ponieważ wydajność nie ma tutaj znaczenia):

  • Używanie osadzonych zmiennych w podwójnych cudzysłowach może prowadzić do skomplikowanych i mylących sytuacji, gdy chcesz osadzić właściwości obiektów, tablice wielowymiarowe itp. Oznacza to, że generalnie podczas czytania osadzonych zmiennych nie możesz być natychmiast w 100% pewien ostatecznego zachowania tego, co czytasz .

  • Często trzeba dodawać kule, takie jak {}i \, które IMO wprowadza zamieszanie i czyni czytelność konkatenacji prawie równoważną, jeśli nie lepszą.

  • Na przykład, gdy tylko chcesz zawinąć wywołanie funkcji wokół zmiennej var htmlspecialchars($var), musisz przejść do konkatenacji.

  • AFAIK, nie można osadzać stałych.

W niektórych szczególnych przypadkach „podwójne cudzysłowy z osadzaniem zmiennych” mogą być przydatne, ale ogólnie rzecz biorąc, wybrałbym konkatenację (stosowanie pojedynczych lub podwójnych cudzysłowów, gdy jest to wygodne)

Frosty Z
źródło
5

Wiem, że to pytanie ma już wybraną odpowiedź, ale znalazłem ten artykuł, który ewidentnie pokazuje, że interpolacja łańcuchów działa szybciej niż konkatenacja. Może to być pomocne dla tych, którzy nadal mają wątpliwości.

Denis V.
źródło
3

Idź z pierwszym i użyj pojedynczych cytatów!

  1. Jest łatwiejszy do odczytania, co oznacza, że ​​inni programiści będą wiedzieć, co się dzieje
  2. Działa nieco szybciej. Sposób, w jaki tworzone są opcodes, gdy PHP analizuje kod źródłowy, i tak to zrobi, więc pomóż mu!
  3. Jeśli użyjesz również pojedynczych cudzysłowów zamiast podwójnych cudzysłowów, jeszcze bardziej zwiększysz swoją wydajność.

Jedyne sytuacje, kiedy należy użyć cudzysłowów, to kiedy trzeba \r, \n, \t! Koszty ogólne po prostu nie są warte użycia w żadnym innym przypadku.

Powinieneś również sprawdzić konkatenację zmiennych PHP , phpbench.com, aby znaleźć pewne testy porównawcze różnych metod robienia rzeczy.

Chez
źródło
19
-1: Używanie pojedynczych cudzysłowów nie ma żadnego rzeczywistego wpływu na wydajność. Połączona strona pokazuje różnice między dwiema metodami w mikrosekundach , czyli 0,000001 sekundy. Każde zapytanie do bazy danych potrwa setki razy. Ta debata jest całkowicie bezcelowa.
Pekka,
Warto wspomnieć \r, \na \tponieważ inne odpowiedzi nie zawierały tego fragmentu.
evilReiko
2

To tylko kwestia gustu.
Używaj, co chcesz.

Najczęściej używam drugiego, ale to zależy.

Pozwól, że zasugeruję ci także dobry edytor, który podświetli zmienną wewnątrz łańcucha

Twój zdrowy rozsądek
źródło
Mam potrzebny obszar tekstowy. Skały PSPad .
Web_Designer,
2

Nie konkatenuj. To nie jest potrzebne, przecinki, ponieważ echo może przyjmować wiele parametrów

echo "Welcome ", $name, "!";

Jeśli chodzi o stosowanie pojedynczych lub podwójnych cudzysłowów, różnica jest znikoma, możesz wykonać testy z dużą liczbą ciągów znaków, aby sprawdzić je sam.

David Gillen
źródło
6
Dotyczy to tylko echa. Wypróbuj to dla zmiennego przypisania i patrz, jak twój kod wysadza.
Marc B,
1

Powinieneś wybrać pierwszy. Nie mają żadnej różnicy, z wyjątkiem wydajności, pierwsza będzie szybka w porównaniu z drugą.

Jeśli zmienna w podwójnym cudzysłowie PHP zajmie trochę czasu na przeanalizowanie zmiennej.

Sprawdź to Pojedyncze cudzysłowy lub podwójne cudzysłowy dla zmiennego łączenia?

To kolejny przykład Czy istnieje korzyść w postaci pojedynczego cytatu vs podwójnego cytatu w PHP?

Nie rozumiem, dlaczego ta odpowiedź w powyższym linku została oceniona pozytywnie i dlaczego ta odpowiedź została przyjęta.

Tak jak powiedziałem to samo.

Możesz też na to spojrzeć

Co jest szybsze w PHP, pojedynczych lub podwójnych cudzysłowach?

Shakti Singh
źródło
5
-1 dla przedwczesnej optymalizacji. Różnica w wydajności nie jest wystarczająca, aby być czynnikiem, chyba że drukujesz miliony razy w jednym skrypcie - a nawet wtedy każde inne przetwarzanie zmniejszy dodatkowe kilka sekund, które możesz poświęcić na drukowanie w jedną stronę zamiast w drugą . Główną różnicą między nimi jest czytelność (co prowadzi mnie do preferowania drugiego stylu).
cHao
1
Mogę spróbować odpowiedzieć na twoje ostatnie pytanie. W społeczności PHP jest wiele dzikich plotek, a niektóre z nich są bardzo silne. Ujawnienie ich wymaga wielu wysiłków. Ale powoli to się zmienia. Tak więc odpowiedź, z którą się łączysz, jest stara, z czasów, gdy ludziom to nie przeszkadzało. Podczas gdy w tym niektóre osoby odpowiedziały na podstawie własnego doświadczenia, a nie na jakimś czytanym artykule.
Twój zdrowy rozsądek
Utrata wydajności wynosi fałsz +1 @cHao. Oto artykuł z danymi, które to potwierdzają. nikic.github.io/2012/01/09/…
Damian
1

Jeśli chcesz wykonać SQLpolecenie, a twoje zmienne są elementami tablicy, nie powinieneś używać pojedynczych cudzysłowów wewnątrz []tablicy (tak jak to ['']:); na przykład, jeśli użyjesz tego ciągu jako polecenia SQL, otrzymasz server error 500:

$con = mysqli_connect('ServerName', 'dbUsername', 'dbPassword');
mysqli_select_db($con, 'dbName')

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray['TraceNo']')";
mysqli_query($con, $sql)

Prawidłowy ciąg to:

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray[TraceNo]')";
Hamid Araghi
źródło
Zamiast tego powinieneś używać PDO
s3c
0

Wiem, że to stare pytanie, ale myślę, że ktoś musi wymienić wszystkie zalety i wady:

Lepsza składnia : to osobiste preferencje.

Wydajność : bez różnicy. Jak wielu wspomniało, podwójne cytowanie może być szybsze, jeśli zastosuje się nierealistycznie wiele zmiennych.

Lepsze wykorzystanie : Pojedyncza oferta (głównie). Jak powiedział @Khez z pojedynczego cudzysłowu można złączyć wszystko, nawet wywołań funkcji i zmiennych modyfikację, tak: echo 'hi ' . trim($name) . ($i + 1);. Jedyną rzeczą cudzysłów może zrobić apostrofu nie może zrobić, to wykorzystanie \n, \r, \ti podobne.

Czytelność : bez różnicy (mogą obowiązywać osobiste preferencje).

Zapisywalność / Ponowne zapisywanie / Debugowanie : W instrukcjach 1-liniowych nie ma różnicy, ale w przypadku wielu linii łatwiej jest komentować / odkomentować linie podczas debugowania lub pisania. Na przykład:

$q = 'SELECT ' .
     't1.col1 ' .
     ',t2.col2 ' .
   //',t3.col3 ' .
     'FROM tbl1 AS t1 ' .
     'LEFT JOIN tbl2 AS t2 ON t2.col2 = t1.col1 ' .
   //'LEFT JOIN tbl3 AS t3 ON t3.col3 = t2.col2 ' .
     'WHERE t1.col1 = ' . $x . ' ' .
     '  AND t2.col2 = ' . $y . ' ' .
   //'  AND t3.col3 = ' . $z . ' ' .
     'ORDER BY t1.col1 ASC ' .
     'LIMIT 10';

Mniej ucieczek : pojedynczy cytat. W przypadku pojedynczego cytatu musisz uciec tylko 2 znaki ( 'i \). W przypadku podwójnego cudzysłowu musisz uciec 2 znaki ( ", \) i 3 dodatkowe w razie potrzeby ( $, {i }).

Mniej zmian : Pojedyncza wycena. Na przykład, jeśli masz następujący kod:

echo 'Number ' . $i . '!';

I musisz zwiększyć 1 do $ i, aby stało się podobne:

echo 'Number ' . ($i + 1) . '!';

Ale w przypadku podwójnego cytatu musisz to zmienić:

echo "Number $i!";

do tego:

echo "Number " . ($i + 1) . "!";

Wniosek : użyj tego, co wolisz .

evilReiko
źródło