PHP - объединять или напрямую вставлять переменные в строку

224

Мне интересно, как правильно вставить переменные PHP в строку?

Сюда:

echo "Welcome ".$name."!"

Или так:

echo "Welcome $name!"

Оба эти метода работают по моему PHP v5.3.5. Последнее короче и проще, но я не уверен, что первое форматирование лучше или считается более подходящим.

Веб-дизайнер
источник
18
если вы делали первое, я лично предпочитаю одинарную кавычкуecho 'Welcome '.$name.'!';
KJYe.Name 葉家仁
1
php.net/manual/en/…
Деян Марьянович
2
@ kjy112 Я сказал то же самое в своем ответе, я ОГРОМНЫЙ поклонник одинарных кавычек: X
Khez
11
Лично я игнорирую все «одинарные кавычки более эффективны» и просто говорю «используйте тот стиль цитирования, который требует последнего количества внутреннего экранирования». Маловероятно, что любой код, который вы напишете, выиграет от любой выгоды MICROSCOPIC из-за меньшего разбора строк по сравнению с увеличенной конкатенацией строк.
Марк Б
1
Заявление о потере производительности является ложным. См. Эту статью в качестве ссылки: nikic.github.io/2012/01/09/…
Дамиан

Ответы:

344

Между этими двумя синтаксисами, вы действительно должны выбрать тот, который вы предпочитаете :-)

Лично я бы пошел с вашим вторым решением в таком случае (Переменная интерполяция) , который я считаю легче писать и читать.

Результат будет таким же; и даже если это влияет на производительность, это не имеет значения 1 .


Как примечание, мой ответ немного более полон: день, когда вы захотите сделать что-то вроде этого:

echo "Welcome $names!";

PHP будет интерпретировать ваш код так, как если бы вы пытались использовать $namesпеременную, которой не существует. - обратите внимание, что это будет работать только в том случае, если вы используете "" не "для своей строки.

В этот день вам нужно будет использовать {}:

echo "Welcome {$name}s!"

Не нужно отступать от конкатенаций.


Также обратите внимание, что ваш первый синтаксис:

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

Возможно, можно оптимизировать , избегая конкатенации, используя:

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

(Но, как я уже говорил, это не имеет большого значения ...)


1 - Если вы не делаете сотни тысяч конкатенаций против интерполяций - и это, вероятно, не совсем так.

Паскаль МАРТИН
источник
3
Отлично, спасибо! очень приятно знать, что я могу использовать мой любимый метод вставки его непосредственно в строку, и я очень благодарен за то, что теперь знаю, как отделить переменную от остальной части строки, если это необходимо, используя {}.
Web_Designer
64
Просто обратите внимание, что разделение строковых литералов и переменных запятыми работает только с ними echo, а не где-либо еще.
Колинкамерон
3
Просто указав на производительность: time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = $string.$i; } print("Done!\n");'(конкатенация) фактически теряет примерно 300 миллисекунд (для 200 000 элементов это 1 миллисекунда на тысячу элементов в вашем наборе ...). Это статистический шум, невозможно даже измерить разницу. Учитывая, что это более читабельно, time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = "{$string}{$i}"; } print("Done!\n");'(Интерполяция) является бесспорным победителем ...
Фернандо Кордейру
1
Если вы хотите использовать интерполяцию, вы должны использовать двойные кавычки.
Максима Алекс
Можно ли использовать функции внутри строки? как эхо "Это {foo ()} приятно"; ?
strix25
17

Строки в двойных кавычках более элегантны, потому что вам не нужно разбивать строку каждый раз, когда вам нужно вставить переменную (как вы должны делать со строками в одинарных кавычках).

Однако, если вам нужно вставить возвращаемое значение функции, его нельзя вставить в строку в двойных кавычках - даже если вы заключите ее в фигурные скобки!

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

//the only option
$s = "Hello " . trim($world) . "!";
Майкл
источник
10
Вы можете вставлять функции полу-косвенно в строки через функции переменных PHP 5.3. $x = function() { ...}; $string = "hello {$x(blah blah blah)}", который работает вокруг "ограничения".
Марк Б
5
@ Марк круто, я этого не знал! Вы также можете присвоить имя существующей функции переменной и сделать то же самое:$x = 'trim'; $string = "hello {$x('blah blah blah')}";
Майкл
3
это круто, но крайне нечитаемо, так что надо все равно этого избегать.
Ваш здравый смысл
2
$s = 'Hello ' . trim($world) .'!';Попробуйте использовать одинарные кавычки, когда нечего интерполировать в строке. Это улучшит производительность и может быть использовано как соглашение для определения обоих
Сарат Садасиван Пиллай
9

Начиная с php4 вы можете использовать форматирование строки:

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

Источник: sprintf ()

Оливье Ройо
источник
Безусловно самый безопасный вариант. +1 для хорошей практики и общего соглашения, соответствующего другим языкам
Хавьер Ариас
6

Либо один хорошо. Используйте тот, который лучше виден для вас. И, говоря о видимости, вы также можете проверить printf .

Манос Дилаверакис
источник
5

С точки зрения создания мышления просто , читабельно , последовательно и легко понять (поскольку производительность здесь не имеет значения):

  • Использование встроенных переменных в двойных кавычках может привести к сложным и запутанным ситуациям, когда вы хотите встроить свойства объекта, многомерные массивы и т. Д. То есть, как правило, при чтении встроенных переменных вы не можете быть на 100% уверены в конечном поведении того, что вы читаете. ,

  • Вам часто нужно добавлять костыли, такие как {}и \, что IMO добавляет путаницу и делает читаемость сцепления почти эквивалентной, если не лучше.

  • Например htmlspecialchars($var), как только вам нужно обернуть вызов функции в var , вы должны переключиться на конкатенацию.

  • AFAIK, вы не можете вставлять константы.

В некоторых конкретных случаях «двойные кавычки с встраиванием переменных» могут быть полезны, но, вообще говоря, я бы пошел на конкатенацию (используя одинарные или двойные кавычки, когда это удобно)

Морозный Z
источник
5

Я знаю, что на этот вопрос уже есть выбранный ответ, но я нашел эту статью, которая наглядно показывает, что интерполяция строк работает быстрее, чем конкатенация. Это может быть полезно для тех, кто все еще сомневается.

Денис V
источник
3

Перейти с первым и использовать одинарные кавычки!

  1. Это легче читать, то есть другие программисты будут знать, что происходит
  2. Он работает немного быстрее, способ создания кодов операций, когда PHP анализирует ваш исходный код, в принципе, он все равно сделает это, поэтому протяните ему руку помощи!
  3. Если вы также используете одинарные кавычки вместо двойных, вы еще больше повысите свою производительность.

Единственные ситуации , когда вы должны использовать двойные кавычки, когда вам нужно \r, \n, \t! Накладные расходы просто не стоят того, чтобы использовать их в любом другом случае.

Вам также следует проверить конкатенацию PHP-переменных phpbench.com , чтобы узнать о некоторых методах работы.

Khez
источник
19
-1: использование одинарных кавычек не оказывает реального влияния на производительность. Связанная страница показывает различия между двумя методами в микросекундах , то есть 0,000001 секунды. Любой запрос к базе данных будет занимать сотни раз за это время. Эта дискуссия совершенно бессмысленна.
Пекка
Хороший момент для упоминания \r, \nи так \tкак другие ответы не включали этот бит.
evilReiko
2

Это только вопрос вкуса.
Используйте все, что вы хотите.

Большую часть времени я использую второй, но это зависит.

Позвольте мне также предложить вам хороший редактор, который выделит переменную внутри строки

Ваш здравый смысл
источник
Я получил нужную текстовую область. ПСПад скалы.
Web_Designer
2

Не соединять Это не нужно, мы запятые, так как эхо может принимать несколько параметров

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

Что касается использования одинарных или двойных кавычек, разница незначительна, вы можете выполнить тесты с большим количеством строк, чтобы проверить себя.

Дэвид Гиллен
источник
6
Это относится только к эхо, хотя. Попробуйте это для назначения переменной и посмотрите, как ваш код взрывается.
Марк Б
1

Вы должны выбрать первый. У них нет никакой разницы, кроме производительности, первая будет быстрее по сравнению со второй.

Если переменная внутри двойной кавычки PHP, потребуется время для разбора переменной.

Проверьте это одинарные или двойные кавычки для конкатенации переменных?

Это еще один пример. Есть ли в php одинарная кавычка для повышения производительности по сравнению с двойной кавычкой?

Я не понял, почему за этот ответ в приведенной выше ссылке проголосовали, и почему этот ответ получил отрицательный ответ.

Как я сказал то же самое.

Вы также можете посмотреть здесь

Что быстрее в PHP, одинарные или двойные кавычки?

Шакти Сингх
источник
5
-1 для преждевременной оптимизации. Разница в производительности недостаточна, если вы не печатаете миллионы раз одним сценарием - и даже в этом случае любая другая обработка, которую вы выполняете, затмевает лишнюю пару секунд, которые вы можете потратить на печать в одну сторону вместо другой , Основное различие между ними заключается в удобочитаемости (что заставляет меня предпочитать второй стиль).
cHao
1
Я могу попытаться ответить на ваш последний вопрос. В сообществе PHP много диких слухов, и некоторые из них очень сильны. Это большая борьба, чтобы раскрыть их и требует времени. Но медленно это меняется. Итак, ответ, на который вы ссылаетесь, старый, с тех пор, когда людям было все равно. Хотя в этом вопросе некоторые люди отвечали, основываясь на собственном опыте, а не на какой-то статье, которую они читали.
Ваш здравый смысл
Потеря производительности ложна +1 @cHao. Вот статья с метриками, подтверждающими это. nikic.github.io/2012/01/09/…
Дамиан
1

Если вы хотите выполнить SQLкоманду, а ваши переменные являются членами массива, вам не следует использовать одинарные кавычки внутри []массива (например, так:) ['']; например, если вы используете эту строку в качестве команды SQL, вы получите 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)

Правильная строка:

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray[TraceNo]')";
Хамид Араги
источник
Вы должны использовать PDO вместо этого
s3c
0

Я знаю, что это старый вопрос, но я думаю, что кто-то должен упомянуть все за и против:

Лучший синтаксис : это личное предпочтение.

Производительность : без разницы. Как уже упоминалось, двойные кавычки могут быть быстрее, если использовать нереально много переменных.

Лучшее использование : одинарные кавычки (в основном). По словам @Khez, с одной цитаты можно сцепить что угодно, даже вызовы функций и переменных модификации, например , так: echo 'hi ' . trim($name) . ($i + 1);. Единственное , двойные кавычки могут сделать одиночные кавычки не может сделать , это использование \n, \r, \tи так.

Удобочитаемость : без разницы (могут применяться личные предпочтения).

Возможность записи / повторной записи / отладки : в однострочных операторах нет никакой разницы, но при работе с несколькими строками легче комментировать / раскомментировать строки во время отладки или записи. Например:

$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';

Меньше побега : одиночная кавычка. Для одинарной кавычки вам нужно экранировать только 2 символа ( 'и \). Для двойной кавычки вам нужно экранировать 2 символа ( ", \) и еще 3, если требуется ( $, {и }).

Менее изменений : одинарная кавычка. Например, если у вас есть следующий код:

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

И вам нужно увеличить 1 до $ i, чтобы он стал похожим на:

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

Но для двойной кавычки вам нужно изменить это:

echo "Number $i!";

к этому:

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

Вывод : используйте то, что вы предпочитаете .

evilReiko
источник