PHP - menyatukan atau langsung memasukkan variabel ke dalam string

224

Saya bertanya-tanya, Apa cara yang tepat untuk memasukkan variabel PHP ke dalam string?

Cara ini:

echo "Welcome ".$name."!"

Atau dengan cara ini:

echo "Welcome $name!"

Kedua metode ini berfungsi di blog saya PHP v5.3.5. Yang terakhir lebih pendek dan lebih sederhana tapi saya tidak yakin apakah yang pertama lebih baik memformat atau diterima sebagai lebih tepat.

Desainer web
sumber
18
jika Anda melakukan yang pertama, saya pribadi lebih suka penawaran tunggalecho 'Welcome '.$name.'!';
KJYe.Name 葉家仁
1
php.net/manual/en/…
Dejan Marjanovic
2
@ kjy112 Saya mengatakan hal yang sama dalam jawaban saya, saya penggemar BESAR kutipan tunggal: X
Khez
11
Secara pribadi, saya mengabaikan seluruh "tanda kutip tunggal lebih efisien" dan hanya pergi untuk "menggunakan gaya kutipan mana pun yang membutuhkan jumlah pelarian internal terakhir". Sangat tidak mungkin bahwa kode apa pun yang Anda tulis akan mendapat keuntungan dari setiap keuntungan MICROSCOPIC karena penguraian string yang lebih sedikit vs peningkatan penggabungan string.
Marc B
1
Klaim kehilangan kinerja adalah salah. Lihat artikel ini sebagai referensi: nikic.github.io/2012/01/09/...
Damian

Jawaban:

344

Di antara kedua sintaks tersebut, Anda harus benar-benar memilih yang Anda sukai :-)

Secara pribadi, saya akan pergi dengan solusi kedua Anda dalam kasus seperti itu (interpolasi variabel) , yang saya temukan lebih mudah untuk menulis dan membaca.

Hasilnya akan sama; dan bahkan jika ada implikasi kinerja, itu tidak masalah 1 .


Sebagai seorang sidenote, maka jawaban saya sedikit lebih lengkap: hari Anda ingin melakukan sesuatu seperti ini:

echo "Welcome $names!";

PHP akan menafsirkan kode Anda seolah-olah Anda sedang mencoba menggunakan $names variabel - yang tidak ada. - perhatikan bahwa itu hanya akan bekerja jika Anda menggunakan "" bukan untuk string Anda.

Hari itu, Anda harus menggunakan {}:

echo "Welcome {$name}s!"

Tidak perlu mundur ke concatenations.


Perhatikan juga bahwa sintaks pertama Anda:

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

Mungkin dapat dioptimalkan , menghindari penggabungan, menggunakan:

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

(Tapi, seperti yang saya katakan sebelumnya, ini tidak masalah banyak ...)


1 - Kecuali jika Anda melakukan ratusan ribu rangkaian vs interpolasi - dan itu mungkin tidak sepenuhnya benar.

Pascal MARTIN
sumber
3
Luar biasa, terima kasih! sangat menyenangkan mengetahui bahwa saya dapat menggunakan metode favorit saya untuk memasukkannya langsung ke dalam string, dan saya sangat berterima kasih karena sekarang mengetahui cara memisahkan variabel dari sisa sengatan jika perlu menggunakan {}.
Web_Designer
64
Hanya sebuah catatan yang memisahkan string literal dan variabel dengan koma hanya berfungsi echo, tidak di tempat lain.
colincameron
3
Hanya menunjukkan kinerja: time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = $string.$i; } print("Done!\n");'(Rangkaian) sebenarnya kehilangan sekitar 300 milidetik (untuk 200.000 item, itu 1 milidetik per seribu elemen pada set Anda ...). Itu kebisingan statistik, bahkan tidak mungkin mengukur perbedaan apa pun. Mengingat itu lebih mudah dibaca, time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = "{$string}{$i}"; } print("Done!\n");'(Interpolasi) adalah pemenang yang tak perlu ...
Fernando Cordeiro
1
Jika ingin menggunakan interpolasi, Anda harus menggunakan tanda kutip ganda.
Máxima Alekz
apakah mungkin menggunakan fungsi di dalam string? seperti echo "Ini {foo ()} bagus"; ?
strix25
17

String yang dikutip ganda lebih elegan karena Anda tidak perlu memecah string Anda setiap kali Anda perlu memasukkan variabel (seperti yang harus Anda lakukan dengan string yang dikutip satu kali).

Namun, jika Anda harus memasukkan nilai balik suatu fungsi, ini tidak dapat dimasukkan ke dalam string yang dikutip ganda - bahkan jika Anda mengelilinginya dengan kawat gigi!

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

//the only option
$s = "Hello " . trim($world) . "!";
Michael
sumber
10
Anda dapat menyisipkan fungsi semi-tidak langsung ke dalam string melalui fungsi variabel PHP 5.3. $x = function() { ...}; $string = "hello {$x(blah blah blah)}", yang bekerja di sekitar "pembatasan".
Marc B
5
@ Mark Itu keren, saya tidak tahu itu! Anda juga dapat menetapkan nama fungsi yang sudah ada ke variabel dan melakukan hal yang sama:$x = 'trim'; $string = "hello {$x('blah blah blah')}";
Michael
3
itu keren tapi sangat tidak bisa dibaca, jadi, kita harus menghindarinya.
Akal Sehat Anda
2
$s = 'Hello ' . trim($world) .'!';Coba gunakan tanda kutip tunggal ketika tidak ada yang interpolasi dalam string. Ini akan meningkatkan kinerja dan dapat digunakan sebagai konvensi untuk mengidentifikasi keduanya
Sarath Sadasivan Pillai
9

Sejak php4 Anda dapat menggunakan pemformat string:

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

Sumber: sprintf ()

Olivier Royo
sumber
Sejauh ini pilihan paling aman. +1 untuk praktik yang baik dan konvensi umum yang cocok dengan bahasa lain
Javier Arias
6

Tidak ada yang baik. Gunakan yang memiliki visibilitas lebih baik untuk Anda. Dan berbicara tentang visibilitas Anda juga dapat melihat printf .

Manos Dilaverakis
sumber
5

Dari sudut pandang membuat berfikir sederhana , mudah dibaca , konsisten , dan mudah dipahami (karena kinerja tidak penting di sini):

  • Menggunakan vars tertanam dalam tanda kutip ganda dapat menyebabkan situasi yang rumit dan membingungkan ketika Anda ingin menanamkan properti objek, array multidimensi, dll. Artinya, umumnya ketika membaca vars tertanam, Anda tidak dapat secara instan 100% yakin dengan perilaku akhir dari apa yang Anda baca .

  • Anda sering perlu menambahkan kruk seperti {}dan \, yang menambahkan kebingungan IMO dan membuat pembacaan concatenation hampir setara, jika tidak lebih baik.

  • Segera setelah Anda perlu membungkus panggilan fungsi di sekitar var, misalnya htmlspecialchars($var), Anda harus beralih ke penggabungan.

  • AFAIK, Anda tidak dapat menanamkan konstanta.

Dalam beberapa kasus tertentu, "tanda kutip ganda dengan embel-embel vars" bisa berguna, tetapi secara umum, saya akan melakukan penggabungan (menggunakan tanda kutip tunggal atau ganda saat nyaman)

Frosty Z
sumber
5

Saya tahu pertanyaan ini sudah memiliki jawaban yang dipilih, tetapi saya menemukan artikel ini yang jelas menunjukkan bahwa interpolasi string bekerja lebih cepat daripada penggabungan. Mungkin bermanfaat bagi mereka yang masih ragu.

Denis V
sumber
3

Pergilah dengan yang pertama dan gunakan satu tanda kutip!

  1. Lebih mudah dibaca, artinya programmer lain akan tahu apa yang terjadi
  2. Ini bekerja sedikit lebih cepat, cara opcodes dibuat ketika PHP membedah kode sumber Anda, itu pada dasarnya akan melakukan itu, jadi berikan bantuan!
  3. Jika Anda juga menggunakan tanda kutip tunggal dan bukan tanda kutip ganda, Anda akan meningkatkan kinerja Anda lebih lagi.

Satu-satunya situasi ketika Anda harus menggunakan tanda kutip ganda, adalah ketika Anda butuhkan \r, \n,\t ! Overhead tidak layak untuk digunakan dalam kasus lain.

Anda juga harus memeriksa rangkaian variabel PHP , phpbench.com untuk beberapa tolok ukur pada berbagai metode dalam melakukan sesuatu.

Khez
sumber
19
-1: Menggunakan tanda kutip tunggal tidak memiliki efek kehidupan nyata pada kinerja apa pun. Halaman tertaut menunjukkan perbedaan antara kedua metode dalam mikrodetik , yaitu 0,000001 detik. Permintaan basis data apa pun akan memakan waktu ratusan kali lipat. Debat ini sepenuhnya tidak ada gunanya.
Pekka
Poin yang bagus untuk disebutkan \r, \ndan \tkarena jawaban lain tidak termasuk bagian ini.
evilReiko
2

Itu hanya masalah selera.
Gunakan apa pun yang Anda inginkan.

Sebagian besar waktu saya menggunakan yang kedua tetapi tergantung.

Izinkan saya menyarankan Anda juga untuk mendapatkan editor yang baik yang akan menyoroti variabel di dalam string

Akal Sehat Anda
sumber
Aku punya teks yang dibutuhkan. Batu PSPad .
Web_Designer
2

Jangan digabungkan. Tidak diperlukan, kami koma karena gema dapat mengambil beberapa parameter

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

Mengenai menggunakan tanda kutip tunggal atau ganda perbedaannya dapat diabaikan, Anda dapat melakukan tes dengan sejumlah besar string untuk menguji sendiri.

David Gillen
sumber
6
Ini hanya berlaku untuk gema. Cobalah untuk tugas variabel dan saksikan kode Anda meledak.
Marc B
1

Anda harus memilih yang pertama. Mereka tidak memiliki perbedaan kecuali kinerja yang pertama akan menjadi cepat dibandingkan yang kedua.

Jika variabel di dalam PHP kutipan ganda membutuhkan waktu untuk mem-parsing variabel.

Lihat Kutipan Tunggal atau Kutipan Ganda ini untuk penggabungan variabel?

Ini adalah contoh lain Apakah ada manfaat kinerja kutipan tunggal vs kutipan ganda di php?

Saya tidak mengerti mengapa jawaban di tautan di atas terangkat dan mengapa jawaban ini diturunkan.

Seperti yang saya katakan hal yang sama.

Anda dapat melihat di sini juga

Apa yang lebih cepat di PHP, kutipan tunggal atau ganda?

Shakti Singh
sumber
5
-1 untuk optimasi prematur. Perbedaan dalam kinerja tidak cukup menjadi faktor kecuali Anda mencetak jutaan kali dalam satu skrip - dan bahkan kemudian, setiap proses lain yang Anda lakukan akan mengerdilkan beberapa detik tambahan yang mungkin Anda habiskan untuk mencetak satu arah daripada yang lain . Perbedaan utama di antara mereka adalah keterbacaan (yang membuat saya lebih suka gaya kedua).
cHao
1
Saya dapat mencoba menjawab pertanyaan terakhir Anda. Ada banyak rumor liar di komunitas PHP dan beberapa di antaranya sangat kuat. Sangat sulit untuk mengungkapkannya dan membutuhkan waktu. Tapi perlahan itu berubah. Jadi, jawaban yang Anda tautkan adalah yang lama, sejak saat orang tidak peduli. Sementara dalam yang ini beberapa orang menjawab berdasarkan pengalaman mereka sendiri, bukan pada beberapa artikel yang mereka baca.
Akal Sehat Anda
Kehilangan kinerja adalah +1 palsu @ cao. Inilah artikel dengan metrik yang membuktikannya. nikic.github.io/2012/01/09/...
Damian
1

Jika Anda ingin menjalankan SQLperintah dan variabel Anda adalah anggota array, maka Anda tidak boleh menggunakan tanda kutip tunggal di dalam []array (seperti ini ['']:); misalnya jika Anda menggunakan string ini sebagai perintah SQL, Anda mendapatkan 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)

String yang benar adalah:

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray[TraceNo]')";
Hamid Araghi
sumber
Anda harus menggunakan PDO sebagai gantinya
s3c
0

Saya tahu ini adalah pertanyaan lama, tetapi saya pikir seseorang harus menyebutkan semua pro & kontra:

Sintaks yang lebih baik : Itu preferensi pribadi.

Performa : Tidak ada perbedaan. Seperti banyak disebutkan, double-quote mungkin lebih cepat jika menggunakan banyak variabel yang tidak realistis.

Penggunaan yang Lebih Baik : Kutipan tunggal (kebanyakan). Seperti @Khez mengatakan, dengan kutip tunggal Anda dapat menggabungkan apa-apa, fungsi panggilan bahkan dan variabel modifikasi, seperti: echo 'hi ' . trim($name) . ($i + 1);. Satu-satunya hal double-quote bisa melakukan itu satu-kutipan tidak bisa lakukan adalah penggunaan \n, \r, \tdan sama.

Keterbacaan : Tidak ada perbedaan (semoga preferensi pribadi berlaku).

Writability / Re-Writability / Debugging : Dalam pernyataan 1-baris tidak ada perbedaan, tetapi ketika berhadapan dengan banyak baris, lebih mudah untuk mengomentari / menghapus baris komentar saat debugging atau menulis. Sebagai contoh:

$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 : Kutipan tunggal. Untuk kutipan tunggal, Anda hanya perlu melepaskan 2 karakter ( 'dan \). Untuk kutipan ganda, Anda perlu melepaskan 2 karakter ( ", \) dan 3 lagi jika diperlukan ( $, {dan} ).

Dikurangi Perubahan : Kutipan tunggal. Misalnya jika Anda memiliki kode berikut:

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

Dan Anda harus menambah 1 hingga $ i, sehingga menjadi suka:

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

Tetapi untuk penawaran ganda, Anda harus mengubah ini:

echo "Number $i!";

untuk ini:

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

Kesimpulan : Gunakan apa yang Anda inginkan .

evilReiko
sumber