PHP - об'єднати або безпосередньо вставити змінні в рядок


224

Мене цікавить, який правильний спосіб вставлення змінних PHP в рядок?

Сюди:

echo "Welcome ".$name."!"

Або таким чином:

echo "Welcome $name!"

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


18
якщо ви робили першу, я особисто віддаю перевагу одній цитатіecho 'Welcome '.$name.'!';
KJYe.Name 葉家仁


2
@ kjy112 Я відповів те саме у своїй відповіді, я
ВЕЛИЧИЙ

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, ніде більше.
colincameron

3
Тільки вказуючи на продуктивність: time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = $string.$i; } print("Done!\n");'(Concatenation) фактично втрачається приблизно на 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
@Marc Це здорово, я цього не знав! Ви також можете призначити ім'я існуючої функції змінній і зробити те саме:$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), вам доведеться перейти до конкатенації.

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

У деяких конкретних випадках "подвійні лапки з вбудовою вар" можуть бути корисними, але загалом кажучи, я б пішов на конкатенацію (використовуючи одинарні або подвійні лапки, коли це зручно)


5

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


3

Ідіть з першим і використовуйте одиничні цитати!

  1. Простіше читати, тобто інші програмісти будуть знати, що відбувається
  2. Це працює трохи швидше, те, як створюються опкоди, коли PHP розчленує ваш вихідний код, в основному все-таки це робитиму, так що дайте руку допомоги!
  3. Якщо ви також використовуєте одинарні заміни замість подвійних лапок, ви ще більше збільшите свою ефективність.

Єдині ситуації , коли ви повинні використовувати подвійні лапки, коли вам потрібно \r, \n,\t ! Накладні витрати просто не варто використовувати його в будь-якому іншому випадку.

Ви також повинні перевірити конкатенацію змінної PHP , phpbench.com, на те, чи є деякі орієнтири щодо різних методів ведення справ.


19
-1: Використання одинарних лапок ніяк не впливає на продуктивність. На пов'язаній сторінці показані відмінності між двома методами в мікросекундах , тобто 0,000001 секунди. Будь-який запит до бази даних за цей час займе сотні разів. Ця дискусія абсолютно безглузда.
Pekka

Хороший момент для згадки \r, \nі \tяк інші відповіді цей біт не включав.
evilReiko

2

Це питання лише смаку.
Використовуйте все, що завгодно.

Більшу частину часу я використовую другий, але це залежить.

Дозвольте запропонувати вам також придбати собі хорошого редактора, який підкреслить змінну всередині рядка


Ive отримав необхідні textarea. PSPad порід.
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) . "!";

Висновок : використовуйте те, що вам більше подобається .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.