PHP-konkatenacja lub bezpośrednie wstawianie zmiennych w łańcuchu

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

tędy.:

echo "Welcome ".$name."!"

Lub w ten sposób:

echo "Welcome $name!"
Obie te metody działają w moim PHP v5.3.5. Ten ostatni jest krótszy i prostszy, ale nie jestem pewien, czy pierwszy jest lepszym formatowaniem, czy zaakceptowany jako bardziej właściwy.
Author: Web_Designer, 2011-04-09

11 answers

Pomiędzy tymi dwoma składniami, naprawdę powinieneś 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 istnieją implikacje wydajności, to nie będzie to miało znaczenia 1.


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

echo "Welcome $names!";

PHP zinterpretuje Twój kod tak, jakbyś próbował użyć zmiennej $names -- która nie istnieje.

Tego dnia będziesz musiał użyć {}:

echo "Welcome {$name}s!"

Nie ma potrzeby wycofywania się do konkatenacji.


Zauważ również, że twoja pierwsza składnia:

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

Może być prawdopodobnie zoptymalizowany, unikając konkatenacji, używając:

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

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


1 - chyba, że jesteś wykonywanie setek tysięcy konkatenacji vs interpolacji. i to chyba nie do końca.

 275
Author: Pascal MARTIN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-25 17:30:56

Podwójnie cytowane łańcuchy są bardziej eleganckie, ponieważ nie musisz rozbijać łańcucha za każdym razem, gdy musisz wstawić zmienną(tak jak musisz to zrobić z pojedynczo cytowanymi łańcuchami).

Jednakże, jeśli musisz wstawić wartość zwracaną funkcji, nie można jej wstawić do podwójnego cudzysłowu-nawet jeśli otaczasz ją klamrami!

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

//the only option
$s = "Hello " . trim($world) . "!";
 15
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-09 15:52:13

Oba są w porządku. Użyj tego, który ma lepszą widoczność dla Ciebie. A mówiąc o widoczności możesz również sprawdzić printf .

 5
Author: Manos Dilaverakis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-21 14:45:09

Z punktu widzenia prostego myślenia , czytelny, spójny i Łatwy do zrozumienia (ponieważ wydajność nie ma tu znaczenia):

  • Używanie osadzonych var w podwójnych cudzysłowach może prowadzić do skomplikowanych i mylących sytuacji, gdy chcesz osadzać właściwości obiektów, wielowymiarowe tablice itp. Oznacza to, że zazwyczaj podczas czytania osadzonych VAR-ów nie możesz być natychmiast 100% pewien ostatecznego zachowania tego, kim jesteś czytam.

  • Często trzeba dodać kule, takie jak {} i \, Co IMO dodaje zamieszanie i sprawia, że czytelność konkatenacji jest prawie równoważna, jeśli nie lepsza.

  • Gdy tylko musisz zawinąć wywołanie funkcji wokół var, na przykład htmlspecialchars($var), musisz przełączyć się na konkatenację.

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

W niektórych szczególnych przypadkach" podwójne cudzysłowy z osadzaniem var " mogą być przydatne, ale ogólnie mówiąc, wybrałbym konkatenację (używając pojedynczych lub podwójnych cudzysłowów, gdy jest to wygodne)

 4
Author: Frosty Z,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-23 12:08:48

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.

 4
Author: Denis V,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-13 23:20:17

Od php4 można użyć formatera łańcuchowego:

$num = 5;
$word = 'banana';
$format = 'can you say %d times the word %s';
echo sprintf($format, $num, $word);
 4
Author: Olivier Royo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-11 19:18:48

Idź z pierwszym i używaj pojedynczych cudzysłowów!

  1. jest łatwiejszy do odczytania, co oznacza, że inni programiści będą wiedzieć, co się dzieje
  2. to działa nieco szybciej, sposób, w jaki kod opcodes są tworzone, gdy PHP analizuje Twój kod źródłowy, w zasadzie i tak to zrobi, więc podaj mu pomocną dłoń!
  3. Jeśli używasz również pojedynczych cudzysłowów zamiast podwójnych, zwiększysz swoją wydajność jeszcze bardziej.

Jedynymi sytuacjami, w których powinieneś używać podwójnych cudzysłowów, są sytuacje, w których potrzebujesz \r, \n, \t! Nad głową po prostu nie warto go używać w żadnym innym przypadku.

Powinieneś również sprawdzić konkatenację zmiennej PHP, phpbench.com dla niektórych benchmarków na temat różnych metod robienia rzeczy.

 3
Author: Khez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:20

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

Większość czasu używam drugiego, ale to zależy.

Pozwól, że zasugeruję Ci również, abyś znalazł sobie dobry edytor, który podświetli zmienną wewnątrz łańcucha

 2
Author: Your Common Sense,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-09 15:48:10

Nie konkatenować. To nie jest potrzebne, my przecinki jako echo może przyjmować wiele parametrów

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

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

 2
Author: David Gillen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-09 16:00:04

Powinieneś wybrać pierwszą. Nie mają żadnej różnicy poza osiągami pierwszy będzie szybki w porównaniu z drugim.

Jeśli zmienna wewnątrz podwójnego cudzysłowu PHP zajmie trochę czasu, aby przeanalizować zmienną.

Sprawdź to pojedyncze cudzysłowy lub podwójne cudzysłowy dla zmiennej konkatenacji?

To jest kolejny przykład czy w php istnieje jedno cudzysłów z korzyścią dla wydajności w porównaniu z podwójnym cudzysłowem?

Nie rozumiałem dlaczego ta odpowiedź w wyżej link się upvoted i dlaczego ta odpowiedź dostał downvote.

Jak mówiłem to samo.

Możesz też zajrzeć tutaj

Co jest szybsze w PHP, pojedyncze czy podwójne cudzysłowy?

 1
Author: Shakti Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:26

Wiem, że to stare pytanie, ale myślę, że ktoś musi wymienić wszystkie plusy i minusy: {]}

Lepsza składnia : to osobiste preferencje.

Wydajność : bez różnicy. Jak wielu już wspomniało, Double-quote może być szybszy, jeśli użyje nierealistycznie wielu zmiennych.

Lepsze wykorzystanie : pojedynczy cytat (głównie). Jak powiedział @Khez, za pomocą jednego cytatu można łączyć wszystko, nawet wywołania funkcji i modyfikacje zmiennych, jak tak: echo 'hi ' . trim($name) . ($i + 1);. Jedyny rzeczą, która może zrobić podwójny cytat, że pojedynczy cytat nie może zrobić, jest użycie \n, \r, \t i podobne.

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

Możliwość zapisu/ponownego zapisu / debugowania: w instrukcjach 1-wierszowych nie ma różnicy, ale gdy mamy do czynienia z wieloma wierszami, łatwiej jest komentować / odkomentować wiersze 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';

Less Escaping : single-quote. W przypadku pojedynczego cytatu musisz escape 2 znaki tylko (' i \). Dla podwójnego cytatu musisz uciec 2 znaki (", \) i 3 więcej w razie potrzeby ($, { i }).

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

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

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

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

Ale dla podwójnego cytatu, trzeba będzie zmienić to:

echo "Number $i!";

Do tego:

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

Wniosek: Użycie co wolisz .

 0
Author: evilReiko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-26 12:14:03