PHP'de tek tırnaklı ve çift tırnaklı dizeler arasındaki fark nedir?


796

Neden PHP tek bir tırnak ve bazen çift tırnak içine yerleştirilmiş dize ile bazı kod görmek biraz karışık.

Ben sadece .NET veya C dilinde biliyorum, eğer tek bir teklif, bu bir karakter, bir dize değil demektir.

Yanıtlar:


1086

PHP dizeleri sadece iki şekilde değil, dört şekilde belirtilebilir.

  1. Tek tırnaklı dizeler işleri neredeyse "olduğu gibi" görüntüler. Değişkenler ve çoğu kaçış dizisi yorumlanmaz. Tek istisna, gerçek bir tek tırnak\'görüntülemek için, bir ters eğik çizgi ile kaçabileceğiniz ve bir ters eğik çizgi görüntülemek için başka bir ters eğik çizgi ile kaçabilmenizdir\\( Evet, tek tırnaklı dizeler ayrıştırılır ).
  2. Çift tırnak dizeleri , bir kaç çıkış karakteri (bazı normal ifadeler dahil) görüntüler ve dizelerdeki değişkenler değerlendirilir. Burada önemli bir nokta, değerlendirmek istediğiniz değişkenin adını izole etmek için süslü parantez kullanabilmenizdir . Diyelim ki değişkeniniz var$typeve bunu istiyorsunuzecho "The $types are". Bu değişkeni arayacaktır$types. Bu kullanımdan kurtulmakecho "The {$type}s are"için Dolar işaretini doların önüne veya arkasına koyabilirsiniz. Dizi değişkenlerini ve benzerlerini nasıl kullanacağınızı görmekiçin dize ayrıştırmaya bakın.
  3. Yorumlu metin dizimi sözdizimi çift tırnaklı dizeler gibi çalışır. İle başlar<<<. Bu operatörden sonra bir tanımlayıcı, ardından bir satırsonu sağlanır. Dizenin kendisi ve daha sonra aynı tanımlayıcıyı kapatmak için aynı tanımlayıcıyı izler. Bu sözdiziminde alıntılardan kaçmanıza gerek yoktur.
  4. Nowdoc (PHP 5.3.0'dan beri) dize sözdizimi temel olarak tek tırnaklı dizeler gibi çalışır. Aradaki fark, tek tırnak işaretleri veya ters eğik çizgilerden kaçınmak zorunda olmamasıdır. Bir nowdoc, heredoc için<<<kullanılanlaaynısekansla tanımlanır, ancak aşağıdaki tanımlayıcı tek tırnak içine alınır, örn<<<'EOT'. Nowdoc'da ayrıştırma yapılmaz.

Notlar: Tek tırnak içine tek tırnak ve çift tırnak içine çift tırnak:

$string = 'He said "What\'s up?"';
$string = "He said \"What's up?\"";

Hız:
Tek tırnaklara çift tırnaklardan daha hızlı olma konusunda çok fazla ağırlık koymam. Muhtemelen belirli durumlarda daha hızlıdırlar. İşte PHP 4.3'ten beri ( Useless Optimizationsen alta, bölüme C) tek ve çift tırnakların eşit derecede hızlı olduğu bir yöntemi açıklayan bir makale . Ayrıca, bu kıyaslamalar sayfasında tek bir çift teklif karşılaştırması var. Karşılaştırmaların çoğu aynıdır. Çift tırnakların tek tırnaklardan daha yavaş olduğu bir karşılaştırma vardır.


17
Kıvırcık kaşlı numara için +1. Bunun farkında değildim. Çok kötü, kabuk komut dosyalarıyla aynı kuralları izlemiyor, yani ${variablename}.
devios1

6
Kod için \nbaşka bir şey PHPtek tırnak içinde , ben sadece çift tırnak kullanın .
Jo Smo

'heredoc' bash PHP'ye taşınmış gibi görünüyor ya da değil mi? Neyse büyük cevap, bu yüzden +1 Teşekkürler.
sjsam

2
PHP dokümantasyon yorumlarında ilginç not: php.net/manual/en/language.types.string.php#120160 - \ n ters eğik çizgi ve $ doları için her şeyi ayrıştırmak zorunda oldukları için çok yavaş görünen "çift tırnaklı dizeler" değişken genişleme yapmak için işaretler ", PHP - PERIOD! HIZLI dize birleştirme yöntemi olduğu ortaya çıktı! Tek tırnak sadece dize tamamen değişmez (içinde ayrıştırmak için hiçbir şey ve birleştirmek için hiçbir şey ile), ancak marj çok küçük ve önemli değil. "
dregad

1
Not: "çift ​​tırnak yavaşlığı geçmişte kaldı. Güncellemeler, çift tırnakların işlenmesini bu gün aşırı durumlar hariç tüm hızlarda olduğu kadar artırdı.
SherylHohman

211

İşler tek tırnak içinde değil, çift tırnak içinde değerlendirilir:

$s = "dollars";
echo 'This costs a lot of $s.'; // This costs a lot of $s.
echo "This costs a lot of $s."; // This costs a lot of dollars.

1
Kaçan tek tırnaklar ve kaçan ters eğik çizgiler tek tırnaklı dizelerde bile genişletilir.
Peter Ajtai

43
PHP'de yeni olan birçok geliştiricinin çalıştığı bir hata: canlı $mailbody = 'I want a line break:\nDone.';tutuyor \n. Halbuki: $mailbody = "I want a line break:\nDone.";satır sonunu ayrıştıracaktır.
Kai Noack

İki sentim sadece röportajlar veya kötü amaçlı yazılım geliştirme için gereklidir. İki ifadeden var_dump () öğesini karşılaştırın: içindeki $testWithAsciiAndUtf8Characters = "\x48\x41\x4c\114\117 \u{0147}\u{012B}\u{0144}\u{014D}!"; $simpleTest = '\x48\x41\x4c\114\117 \u{0147}\u{012B}\u{0144}\u{014D}!'; karakter dizileri $testWithAsciiAndUtf8Charactersgerçek harflerle dizeye dönüştürüldü.
Rostyslav Pylypenko

56

' Tek alıntı

Bir dizeyi belirtmenin en basit yolu, onu tek tırnak içine almaktır. Tek tırnak genellikle daha hızlıdır ve içinde alıntılanan her şey düz dize olarak ele alınır.

Misal:

echo 'Start with a simple string';
echo 'String\'s apostrophe';
echo 'String with a php variable'.$name;

" Çift tırnak

Kodu ayırmak için nokta kullanmak zorunda kalmamak için PHP'de çift tırnak kullanın (Not: string'de {}concatenation ( .) operatörü kullanmak istemiyorsanız değişkenleri dahil etmek için süslü parantez kullanın ).

Misal:

echo "Start with a simple string";
echo "String's apostrophe";
echo "String with a php variable {$name}";

PHP bir performans fayda tek tırnak vs çift tırnak var mı?

Evet. Tek tırnak kullanmak biraz daha hızlı.

PHP tek tırnak içinde ne olduğunu yorumlamak için ek işlem kullanmayacaktır. çift ​​tırnak kullandığınızda PHP dizede herhangi bir değişken olup olmadığını kontrol etmek için ayrıştırmak zorundadır.


Tek tek tırnak dize içinde bir şey ayrıştırma DEĞİL istisnası, kullanabileceğiniz şeydir \'dize içinde kullanılmak üzere tek bir kesme işareti kaçmak için (veya \\'ters eğik çizgi görüntülemek için). Geleneksel kaçış dizilerinin, \nyeni satır karakterine ayrıştırılmayacağını unutmayın. Dizelerde PHP belgeleri
SherylHohman

Tüm cevapları görüyorum: değişkenin değerini yazdırmak için değişkenin adını çift tırnak içinde kullanabilirsiniz, ancak söylüyorsunuz, birleştirme işleminden kaçınmak için değişken adı da kıvırcık parantez içine alınmalıdır dönem. Hem "$ my_var" hem de "{$ my_var}" hem $ my_var'ın değerini verirse, parantez ne işe yarar? Teşekkürler!
Bahman.

40

Tek tırnaklı bir dize, içinde yorumlanmış değişkenlere sahip değildir. Çift tırnaklı bir dize yapar.

Ayrıca, çift tırnaklı bir dize ters eğik çizgi içermeyen kesme işaretleri içerebilirken, tek tırnaklı bir dize çıkışsız tırnak işaretleri içerebilir.

Tek tırnaklı dizeler ayrıştırılmaları gerekmediği için çalışma zamanında daha hızlıdır.


8
Tek tırnaklı dizeler de daha az bellek kullanır. PHP dizeleri işlemenin en hızlı yolu tek tırnak ve. dizeleri ve değişkenleri birleştirmek için işleç.
RibaldEddie

hmmm, yanılıyorsam beni düzeltin ama PHP için temel dil C doğru mu? Öyleyse neden string tırnakları PHP ve C'de farklılık gösterir?
rob waminal

1
@rob waminal: PHP C dilinde uygulanabilir, ancak farklı bir dildir. PHP dili bu semantiği belirtir.
Borealid

@Ribald - Artık doc sözdizimi daha hızlı olmaz mıydı? Tek tırnaklı dizeler, kaçan tek tırnaklar ve ters eğik çizgiler için ayrıştırılır.
Peter Ajtai

@Peter, haklı olabilirsin, asla gerçekten kazma zahmetine girmedim. PHP belgeleri hız iddia yapar, inanç üzerine dokümanlar inanmaya karar verdi. :)
RibaldEddie

27

PHP, her iki 'my name've "my name"dize vardır. Bununla ilgili daha fazla bilgiyi PHP el kitabında bulabilirsiniz .

Bilmeniz gereken şey

$a = 'name';
$b = "my $a"; == 'my name'
$c = 'my $a'; != 'my name'

PHP, insanlar sürekli bir dize tanımlamak için tek tırnak kullanmak gibi 'a', 'my name', 'abc xyz'bir dizeyi tanımlamak için çift tırnak kullanırken, gibi tanıtıcı içerir "a $b $c $d".

Ve başka bir şey,

echo 'my name';

daha hızlı

echo "my name";

fakat

echo 'my ' . $a;

daha yavaş

echo "my $a";

Bu, kullanılan diğer dize için geçerlidir.


18

Tek, çift, yorumlu metin ve nowdoc tırnak örnekleri

<?php

    $fname = "David";

    // Single quotes
    echo 'My name is $fname.'; // My name is $fname.

    // Double quotes
    echo "My name is $fname."; // My name is David.

    // Curly braces to isolate the name of the variable
    echo "My name is {$fname}."; // My name is David.

    // Example of heredoc
    echo $foo = <<<abc
    My name is {$fname}
    abc;

        // Example of nowdoc
        echo <<< 'abc'
        My name is "$name".
        Now, I am printing some
    abc;

?>

16

PHP'de tek tırnaklı metin, dize değeri olarak kabul edilir ve çift tırnaklı metin, değerlerini değiştirip işleyerek değişkenleri ayrıştırır.

$test = "variable";
echo "Hello Mr $test"; // the output would be: Hello Mr variable
echo 'Hello Mr $test'; // the output would be: Hello Mr $test

Burada, çift tırnak değeri ayrıştırır ve tek tırnak dize değeri olarak kabul edilir ( $testdeğişkeni ayrıştırmadan ).


12

Her iki kapalı karakter de dizgidir. Bir teklif türü uygun olarak diğer teklif türünü kapsamak için kullanılır. "'" ve '"'. Tırnak türleri arasındaki en büyük fark, ekteki tanımlayıcı referanslarının tek tırnak içinde değil, çift tırnak içinde kullanılmasıdır.


3

Php tek tırnak ve çift tırnak kullanma arasındaki fark echo deyiminde tek tırnak kullanırsanız, o zaman bir dize olarak ele alınır. ... ancak çift tırnak içine değişken adı girersek, bu değişkenin değerini dize ile birlikte çıktılar.


0

Burada değişken ile tek ve çift tırnak bazı olasılıklar

$world = "world";

"Hello '.$world.' ";

'hello ".$world."';

-1

Bir şey:

Heredoc'un kapanış tanımlayıcısına sahip satırın noktalı virgül (;) dışında başka karakter içermemesi gerektiğine dikkat etmek çok önemlidir . Bu, özellikle tanımlayıcının girintili olmayabileceği ve noktalı virgülden önce veya sonra boşluk veya sekme bulunmayabileceği anlamına gelir .

Misal:

   $str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

1
Bu gerçek bir ifadedir, ancak buradaki soru ile ilgisi yoktur.
miken32

-1

Belki biraz geç kaldım ve biraz konu dışıyım, ama işte yine de:

Dizenizin içeriği arasında aşağıdakileri seçmeniz gerekmez:
alert("It's \"game\" time.");veyaalert('It\'s "game" time.');

İngilizce tırnak işaretlerinin kullanımına ve kesme işareti için doğru karaktere aşina iseniz, çift veya tek tırnak kullanabilirsiniz, çünkü artık önemli olmayacaktır:
alert("It’s “game” time.");vealert('It’s “game” time.');

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.