PHP'de heredoc kullanmanın avantajı nedir? [kapalı]


196

PHP'de heredoc kullanmanın avantajı nedir ve bir örnek gösterebilir misiniz?


4
Alternatiflerin heredoclardan daha iyi olmasının güçlü bir nedeni yoktur
Shakti Singh

18
Bunu daha yapıcı olacak şekilde düzenledim ve topluluk wiki'sini oldukça öznel olduğu için yaptım. Not: Topluluk bunu yine de kapatabilir, kaliteli cevaplar aldığınız için onu açık bırakmayı seçtim.
Tim Post

9
Bu soru neden tam olarak yapıcı kabul edilmiyor?
Ambo100

Yanıtlar:


218

Yorumlu metin sözdizimi benim için çok daha temiz ve çok satırlı dizeler ve alıntı sorunlarından kaçınmak için gerçekten yararlı. SQL sorguları oluşturmak için bunları kullandığım güne geri döndüm:

$sql = <<<SQL
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = "widgets"
SQL;

Bana göre bu, sözdizimi hatası verme olasılığını tırnak işareti kullanmaktan daha düşüktür:

$sql = "
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = \"widgets\"
";

Başka bir nokta, dizenizde çift tırnak işareti kullanmaktan kaçınmaktır:

$x = "The point of the \"argument" was to illustrate the use of here documents";

Yukarıdaki pProblem sözdizimi hatası (eksik kaçan alıntı) Ben sadece burada belge sözdizimi aksine tanıttı:

$x = <<<EOF
The point of the "argument" was to illustrate the use of here documents
EOF;

Bu biraz stil, ama ben dizeleri tanımlamak için tek, çift ve burada belgeler için kural olarak aşağıdakileri kullanıyorum:

  • Dize benzer bir sabit olduğunda tek tırnak kullanılır'no variables here'
  • Dizeyi tek bir satıra koyabildiğimde ve değişken enterpolasyon veya gömülü tek tırnak gerektirdiğimde çift tırnak işareti"Today is ${user}'s birthday"
  • Burada , biçimlendirme ve değişken enterpolasyon gerektiren çok satırlı dizelerin belgeleri.

40
SQL örneğinizde Nitpick: İlk başta orada çift tırnak kullanmamalısınız. Bu yalnızca MySQL ile çalışır ve yalnızca bu sunucu --ansiuyumlu modda çalışmadığında . SQL dizeleri gerekir tek tırnak kullanın.
mario

17
@mario sql özellikleri ile ilgili değil genel olarak çift tırnak kullanarak sorunu göstermek için oldu
Wes

4
Değişkenleri doğrudan bir sorguya yerleştirmenin kötü, kötü bir tavır olduğunu söylememeliyiz:
Common Sense

5
@Wes and @mario Bu ANSI SQL:SELECT * FROM "order" WHERE "table"='1'
programaths

11
"Değişkenleri doğrudan sorguya yerleştirmenin kötü, kötü bir tavır olduğunu söylememek". Bu hiç doğru değil. Doğrulanmamış girişi SQL ifadelerine yerleştirmek "kötü davranış" tır. Değişkenleri SQL deyimlerinin içine yerleştirmek bazen gereklidir.
vogomatix

67

Yorumlu metinler, okunabilirlik ve bakım kolaylığı nedeniyle alıntılanan dizelere mükemmel bir alternatiftir. Tırnaklardan kaçmak zorunda değilsiniz ve (iyi) IDE'ler veya metin editörleri uygun sözdizimi vurgulamasını kullanır.

Bir çok genel bir örnek: PHP içinden dışarı HTML yankılanan:

$html = <<<HTML
  <div class='something'>
    <ul class='mylist'>
      <li>$something</li>
      <li>$whatever</li>
      <li>$testing123</li>
    </ul>
  </div>
HTML;

// Sometime later
echo $html;

Okuması ve bakımı kolaydır.

Alternatif, kaçan tırnaklar ve IDE'lerin söz konusu dilin sözdizimini vurgulamayacağı ve tırnakların okunabilirliğinin azalmasına ve bakımda daha fazla zorluğa yol açacak olan alıntı dizelerin yankılanmasıdır.

Ortak Duygunuz için güncellenmiş cevap

Elbette HTML olarak vurgulanmış bir SQL sorgusu görmek istemezsiniz. Diğer dilleri kullanmak için sözdizimindeki dili değiştirmeniz yeterlidir:

$sql = <<<SQL
       SELECT * FROM table
SQL;

1
PHP'nin " PHP'den Kaçış " özelliğini biliyor musunuz ?
Ortak Duygunuz

5
PHP'den kaçmak bazen iyidir, ancak çok fazla şey yankılanırken sözdizimi vurgulama kırılmaları, PHP'den kaçarak daha fazla karakter yazmanız gerekir ve PHP'nin tek bir yankı yerine daha fazla komutu çalıştırması gerekir. Ayrıca, bir Heredoc dizesini bir değişkene ayarlayabilir ve daha sonra yankılayabilirsiniz. HTML'niz için PHP'den kaçmak, o zaman ve orada yazdırıldığı anlamına gelir. Daha sonra saklayamıyorum.
Jake Wilson

2
1. çıktıyı kaydetmek için çıktı tamponlama kullanabilirsiniz. 2. İlk örneğinizde yankı kullanıyordunuz. 3. (iyi) IDE'ler veya metin editörleri PHP'den kaçarken HTML ASLA vurgulamayın. 4. Sözdizimi HEREDOC için hangi IDE'yi vurgulamaktadır ve hangi dil kuralları kullanılmaktadır? HTML metni olarak vurgulanmış bir SQL sorgusu görmek uygun mudur?
Ortak Duygunuz

1
Bir Yorumlu metin bir PHP dizesidir. Elbette bir dizede kontrol yapılarını kullanamazsınız. php.net/manual/en/language.types.string.php
Jake Wilson

11
Bence Heredoc'u sadece HTML dizelerine uygulamak için yanlış anlıyorsunuz. Yorumlu metinler, HTML veya SQL sorgusu veya istediğiniz herhangi bir şey olsun, bir dizeyi tanımlamanın alternatif bir yoludur. Yazmaları ve bakımları daha kolay, Wes'in yukarıdaki cevabı oldukça açık bir şekilde gösteriyor (eğer not ederseniz doğru sözdizimi vurgulaması var. NetBeans'in başarısızlığı hakkında bana şikayet etmeyin). Neden bir topluluk wiki sorusuna bir cevap aşağı oylama konusunda bu kadar bükülmüş gibi görünmüyorum ... İster inanın ister inanmayın, orijinal PHP geliştiricileri Heredoc's PHP dahil olabilir, çünkü bazı durumlarda gerçekten yararlı olabilir .. .
Jake Wilson

8

Bazı IDE'ler heredoc dizelerindeki kodu otomatik olarak vurgular - bu, XML veya HTML için heredoc kullanımını görsel olarak çekici kılar.

Alıntı karakterleri alıntı hakkında umurumda değil ve sadece XML yapıştırabilirsiniz çünkü ben şahsen yani XML daha uzun bölümleri için seviyorum.


6

Her şeyden önce, tüm nedenler özneldir. Bir sebepten ziyade bir zevk meselesi gibidir.

Şahsen, heredoc'u oldukça yararsız buluyorum ve ara sıra kullanıyorum, çoğu zaman bir değişkene biraz HTML almam gerektiğinde ve örneğin bir HTML e-posta mesajı oluşturmak için çıktı arabelleği ile uğraşmak istemediğimde.

Biçimlendirme genel girinti kurallarına uymuyor, ancak bunun çok önemli olduğunu düşünmüyorum.

       //some code at it's proper level
       $this->body = <<<HERE
heredoc text sticks to the left border
but it seems OK to me.
HERE;
       $this->title = "Feedback";
       //and so on

Kabul edilen cevaptaki örneklere gelince, sadece hile yapıyor.
Dize örnekleri, aslında, eğer onları aldatmazsa daha özlü olmak

$sql = "SELECT * FROM $tablename
        WHERE id in [$order_ids_list]
        AND product_name = 'widgets'";

$x = 'The point of the "argument" was to illustrate the use of here documents';

3

Yorumlu makalenin tembellik olduğunu söyleyebilir miyim bilmiyorum. Bir şey yapmanın tembellik olduğunu söyleyebiliriz, çünkü her zaman bir şey yapmanın daha hantal yolları vardır.

Örneğin, belirli durumlarda, bir dosyadan getirmek ve şablon değiştirmeyi çalıştırmak zorunda olmadan katıştırılmış değişkenlerle metin çıktısı almak isteyebilirsiniz. Yorumlu metin alıntılardan kaçmak zorunda kalmanıza izin vermez, böylece gördüğünüz metin çıkardığınız metindir. Açıkça, bazı olumsuzluklar var, örneğin, yorumlu metin girintisi olamaz ve bu belirli bir durumda, özellikle de birleşik sözdizimi için bir sopa varsa, sinir bozucu olabilir.

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.