PHP - değişkenleri birleştirin veya doğrudan dizeye ekleyin


224

Merak ediyorum, bir dizeye PHP değişkenleri eklemek için uygun yolu nedir?

Bu yoldan:

echo "Welcome ".$name."!"

Veya bu şekilde:

echo "Welcome $name!"

Bu yöntemlerin ikisi de benim PHP v5.3.5. İkincisi daha kısa ve daha basit ama birincisinin daha iyi biçimlendirme olup olmadığından veya daha uygun olarak kabul edildiğinden emin değilim.


18
Eğer echo 'Welcome '.$name.'!';
ilkini yapsaydım


2
@ kjy112 Cevabımda aynı şeyi söyledim, ben tek tırnak BÜYÜK bir hayranıyım: X
Khez

11
Şahsen, ben "tek tırnak daha verimli" tüm görmezden ve sadece "hangi alıntı tarzı son kaçış iç kaçış gerektiriyorsa kullanın" için gidin. Yazdığınız herhangi bir kodun, daha fazla dize ayrıştırma ve artan dize birleşiminden dolayı herhangi bir MICROSCOPIC kazanımından faydalanması pek olası değildir.
Marc B

1
Performans kaybı iddiası yanlıştır. Bu makaleye referans olarak bakın: nikic.github.io/2012/01/09/…
Damian

Yanıtlar:


344

Bu iki sözdizimi arasında, gerçekten tercih ettiğiniz sözdizimini seçmelisiniz :-)

Şahsen, hem yazmayı hem de okumayı daha kolay bulduğum böyle bir durumda (Değişken enterpolasyon) ikinci çözümünüzle giderdim .

Sonuç aynı olacaktır; ve performans sonuçları olsa bile, bunlar önemli olmayacaktır 1 .


Bir sidenote olarak, cevabım biraz daha eksiksiz: böyle bir şey yapmak isteyeceğiniz gün:

echo "Welcome $names!";

PHP kodunuzu $namesvar olmayan değişkeni kullanmaya çalışıyormuş gibi yorumlayacaktır . - yalnızca dizeniz için "" değil "kullanırsanız çalışacağını unutmayın.

O gün şunları kullanmanız gerekir {}:

echo "Welcome {$name}s!"

Birleştirme işlemlerine geri dönmeye gerek yok.


Ayrıca ilk sözdiziminizin:

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

Muhtemelen aşağıdakiler kullanılarak birleştirmelerden kaçınarak optimize edilebilir:

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

(Ama, daha önce söylediğim gibi, bu çok önemli değil ...)


1 - İnterpolasyonlara karşı yüz binlerce birleştirme yapmadıkça - ve muhtemelen böyle değildir.


3
Harika teşekürler! doğrudan dizeye eklemek için en sevdiğim yöntemi kullanabileceğini bilmek çok güzel ve şimdi eğer gerekiyorsa, sokmanın geri kalanından değişkenin nasıl ayrılacağını bildiğim için çok minnettarım {}.
Web_Designer

64
Dize değişmezlerini ve değişkenleri virgülle ayırmanın echobaşka hiçbir yerde değil, yalnızca birlikte çalıştığını unutmayın.
colincameron

3
Sadece performansa dikkat edin: time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = $string.$i; } print("Done!\n");'(Birleştirme) aslında yaklaşık 300 milisaniye kaybeder (200.000 öğe için, setinizdeki bin öğe başına 1 milisaniye ...). Bu istatistiksel gürültü, herhangi bir farkı ölçmek bile imkansız. Daha okunabilir olduğu düşünüldüğünde, time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = "{$string}{$i}"; } print("Done!\n");'(İnterpolasyon) tartışmasız kazanan ...
Fernando Cordeiro

1
İnterpolasyon kullanmak istiyorsanız çift tırnak kullanmalısınız.
Máxima Alekz

string içinde fonksiyonlar kullanmak mümkün mü? echo gibi "Bu {foo ()} güzel"; ?
strix25

17

Çift tırnaklı dizeler daha zariftir, çünkü her değişken eklemeniz gerektiğinde dizenizi koparmanız gerekmez (tek tırnaklı dizelerle yapmanız gerektiği gibi).

Ancak, bir işlevin dönüş değerini girmeniz gerekiyorsa, çift tırnaklı bir dizeye eklenemez - parantez içine alsanız bile!

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

//the only option
$s = "Hello " . trim($world) . "!";

10
PHP 5.3 değişken işlevleri aracılığıyla dizelere yarı dolaylı olarak işlev ekleyebilirsiniz. $x = function() { ...}; $string = "hello {$x(blah blah blah)}", "kısıtlama" etrafında çalışır.
Marc B

5
@Marc Çok güzel, bunu bilmiyordum! Ayrıca bir değişkene mevcut bir fonksiyonun adını atayabilir ve aynı şeyi yapabilirsiniz:$x = 'trim'; $string = "hello {$x('blah blah blah')}";
Michael

3
bu serin ama son derece okunamaz, bu yüzden, yine de kaçınmalısınız.
Ortak Duygunuz

2
$s = 'Hello ' . trim($world) .'!';Performansını artıracağını ve her iki tanımlamak için bir kongre olarak kullanılabilir string.It içinde interpolate bir şey olduğunda tek tırnak kullanmayı deneyin
Sarath Sadasivan Pillai'yi

9

Php4 beri bir dize biçimlendirici kullanabilirsiniz:

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

Kaynak: sprintf ()


En güvenli seçenek. Diğer diller ile eşleşen iyi uygulama ve genel toplantı için +1
Javier Arias

6

İkisinden biri iyi. Sizin için daha iyi görünür olanı kullanın. Ve görünürlükten bahsederek printf'i de kontrol edebilirsiniz .


5

Düşüncelerin basit , okunabilir , tutarlı ve kolay anlaşılır hale getirilmesi açısından (performans burada önemli olmadığından):

  • Çift tırnak işaretleri içinde gömülü değişkenler kullanmak, nesne özelliklerini, çok boyutlu dizileri vb. Gömmek istediğinizde karmaşık ve kafa karıştırıcı durumlara yol açabilir. .

  • Sık sık IMO'nun karışıklık katan ve birleştirme okunabilirliğini daha iyi olmasa bile neredeyse eşdeğer hale getiren {}ve gibi koltuk değneklerini eklemeniz gerekir \.

  • Örneğin htmlspecialchars($var), bir işlev çağrısını var'ın etrafına sarmanız gerektiğinde , birleştirme işlemine geçmeniz gerekir.

  • AFAIK, sabitleri gömemezsiniz.

Bazı özel durumlarda, "vars gömme ile çift tırnak" yararlı olabilir, ancak genel olarak konuşursak, birleştirme için giderdim (uygun olduğunda tek veya çift tırnak kullanarak)


5

Bu sorunun zaten seçilmiş bir cevabı olduğunu biliyorum, ancak açıkça dize enterpolasyonunun birleştirme işleminden daha hızlı çalıştığını gösteren bu makaleyi buldum . Hala şüphe duyanlar için yararlı olabilir.


3

İlk git ve tek tırnak kullanın!

  1. Okuması daha kolay, yani diğer programcılar neler olduğunu bilecek
  2. Biraz daha hızlı çalışır, PHP kaynak kodunuzu parçaladığında opcodların oluşturulma şekli, temelde bunu yine de yapacak, bu yüzden bir yardım eli verin!
  3. Çift tırnak yerine tek tırnak da kullanırsanız, performansınızı daha da artırırsınız.

İhtiyacınız olduğunda çift tırnak kullanmalısınız tek durumlar olduğunu \r, \n, \t! Tepegöz başka bir durumda kullanmaya değmez.

Ayrıca , PHP değişken değişkeni olan phpbench.com'u farklı şeyler yapma yöntemlerine ilişkin bazı ölçütler için de kontrol etmelisiniz .


19
-1: Tek tırnak kullanmanın performans üzerinde gerçek bir etkisi yoktur. Bağlantılı sayfa, mikrosaniye cinsinden iki yöntem arasındaki farklılıkları gösterir , yani 0.000001 saniyedir. Herhangi bir veritabanı sorgusu o zaman yüzlerce kez alacaktır. Bu tartışma tamamen anlamsız.
Pekka

Söz için nokta İyi \r, \nve \tdiğer cevaplar bu biraz içermiyordu.
evilReiko

2

Sadece tat meselesi.
Ne istersen onu kullan.

Çoğu zaman ikincisini kullanıyorum ama buna bağlı.

Ayrıca kendinize bir dizenin içindeki bir değişkeni vurgulayacak iyi bir editör edinmenizi öneriyorum


İhtiyacım olan metinleri aldım. PSPad kayalar.
Web_Designer

2

Birleştirmeyin. Gerek yok, yankı olarak birden çok parametre alabileceğimiz için virgül kullanıyoruz

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

Tek veya çift tırnak kullanarak fark göz ardı edilebilir, kendiniz test etmek için çok sayıda dizeyle testler yapabilirsiniz.


6
Bu sadece yankı için geçerlidir. Değişken bir atama için deneyin ve kodunuzun patlamasını izleyin.
Marc B

1

İlkini seçmelisin. Birincisinin ikincisinin karşılaştırmasında hızlı olacağı performans dışında hiçbir farkı yoktur.

Eğer çift tırnak içinde değişken PHP değişken ayrıştırmak için zaman ayırın.

Değişken birleştirme için bu Tek tırnak veya çift tırnak göz atın ?

Bu başka bir örnek php çift tırnak vs bir performans fayda tek teklif var mı?

Yukarıdaki bağlantıdaki bu cevabın neden yükseltildiğini ve bu cevabın neden düştüğünü anlamadım.

Dediğim gibi aynı şey.

Buraya da bakabilirsin

PHP, tek veya çift tırnak içinde daha hızlı nedir?


5
Erken optimizasyon için -1. Bir komut dosyasında milyonlarca kez yazdırmıyorsanız, performanstaki fark bir faktör olmak için yeterli değildir - ve o zaman bile, yaptığınız diğer işlemler, diğeri yerine bir şekilde yazdırmak için harcadığınız fazladan birkaç saniyeyi gölgede bırakır . Aralarındaki en büyük fark okunabilirliktir (bu da ikinci stili tercih etmemi sağlıyor).
cHao

1
Son sorunuza cevap vermeye çalışabilirim. PHP topluluğunda birçok vahşi söylenti var ve bazıları çok güçlü. Onları ifşa etmek büyük bir mücadele ve zaman alıyor. Ama yavaş yavaş değişiyor. Bu nedenle, bağlandığınız cevap, insanların umursamadığı zamanlardan kalmadır. Bu sırada bazı insanlar okudukları bazı makalelere değil, kendi deneyimlerine dayanarak cevap verdiler.
Ortak Duygunuz

Performans kaybı yanlış +1 @ cHao. İşte metrikleri kanıtlayan bir makale. nikic.github.io/2012/01/09/…
Damian

1

Bir SQLkomutu yürütmek istiyorsanız ve değişkenleriniz dizi üyeleriyse, []dizinin içinde tek tırnak kullanmamalısınız (şöyle:) ['']; örneğin bu dizeyi SQL komutu olarak kullanırsanız, şunları elde edersiniz 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)

Doğru dize:

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

Bunun yerine
PDO'ları

0

Bunun eski bir soru olduğunu biliyorum, ama birinin tüm artılarını ve eksilerini belirtmesi gerektiğini düşünüyorum:

Daha İyi Sözdizimi : Bu kişisel tercihtir.

Performans : Fark yok. Daha önce de belirtildiği gibi, gerçekçi olmayan çok sayıda değişken kullanılıyorsa çift tırnak daha hızlı olabilir.

Daha İyi Kullanım : Tek teklif (çoğunlukla). @Khez dediği gibi, tek bir teklifle Eğer bir şey, hatta fonksiyon çağrıları ve değişken modifikasyon bitiştirmek şöyle olabilir: echo 'hi ' . trim($name) . ($i + 1);. Tek şey çift tırnak yapamaz tek tırnak kullanımı olduğunu yapabilir \n, \r, \tve benzeri.

Okunabilirlik : Fark yok (kişisel tercih geçerli olabilir).

Yazılabilirlik / Yeniden Yazılabilirlik / Hata Ayıklama : 1 satırlık ifadelerde bir fark yoktur, ancak birden çok satırla uğraşırken, hata ayıklama veya yazma sırasında satırları yorumlamak / açıklamayı kaldırmak daha kolaydır. Örneğin:

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

Daha Az Kaçış : Tek tırnak. Tek bir alıntı için sadece 2 karakter ( 've \) kaçmak gerekir . Çift tırnak için, 2 karakter (kaçmak gerekir ", \) ve 3 daha gerekirse ( $, {ve }).

Daha Az Değişiklik : Tek teklif. Örneğin, aşağıdaki kodunuz varsa:

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

Ve 1 i $ i artırmanız gerekiyor, bu yüzden beğenir:

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

Ancak çift tırnak için bunu değiştirmeniz gerekecek:

echo "Number $i!";

buna:

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

Sonuç : İstediğinizi kullanın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.