En İyi Uygulamalar: PHP'de uzun, çok satırlı dizelerle mi çalışıyorsunuz?


177

Not: Bu son derece basit bir soru ise özür dilerim ama kodumun biçimlendirilmesi konusunda biraz saplantılı bir kompulsifim var.

Bir e-posta gövde metnini yapacak bir dize döndüren bir işlevi olan bir sınıf var. Bu metnin e-postada doğru görünmesi için biçimlendirilmesini istiyorum, aynı zamanda kodumu korkak göstermiyor. Demek istediğim şu:

class Something
{
    public function getEmailText($vars)
    {
        $text = 'Hello ' . $vars->name . ",

The second line starts two lines below.

I also don't want any spaces before the new line, so it's butted up against the left side of the screen.";
        return $text;
    }
}

ancak şu şekilde de yazılabilir:

public function getEmailText($vars)
{
    $text = "Hello {$vars->name},\n\rThe second line starts two lines below.\n\rI also don't want any spaces before the new line, so it's butted up against the left side of the screen.";
    return $text;
}

ama yeni hatlar ve satır başı ile olan anlaşma nedir? Fark ne? Mı \n\neşdeğer \r\rveya \n\r? Çizgiler arasında çizgi boşluğu oluştururken hangisini kullanmalıyım?

Sonra çıktı tamponlama ve yorumlu sözdizimi seçeneği var.

Nesnelerinizde uzun çok satırlı dizeler kullanmakla nasıl başa çıkıyorsunuz?


3
Her zaman \ n Unix'te yeni satır / OS / X öncesi MacOS'ta yeni satır ve Windows'ta \ r \ n yeni satır olduğunu düşünürdüm. Ayrıca, bunun bir e-posta iletisinde görünen bir dize olacağını düşünürsek, bunu yaptığınız hangi yoldan olursa olsun çoğu komut postası istemcisinde doğru bir şekilde görüntülendiğinden emin olmak istersiniz. İpucu: Outlook bazı durumlarda fazladan yeni satır karakterleri kaldırır, böylece her zaman beklediğiniz şeyi elde edemezsiniz.
Kenny Drobnack

1
Bunların bu kadar önemli olup olmadığından emin değilim, ama aslında iki 'newline' karakteri iki karakter kullanan fiziksel bir daktilo olduğunda geldi. Biri taşıyıcıyı sayfanın sol tarafına geri koymak için (CR - 0xD) ve biri sayfanın bir sonraki satıra gitmesine neden olan biri (LF - 0xA.) Eminim bu konuda daha fazla bilgi sahibi insanlar var ancak.
mkgrunder

Yanıtlar:


289

HEREDOC veya NOWDOC kullanmalısınız.

$var = "some text";
$text = <<<EOT
  Place your text between the EOT. It's
  the delimiter that ends the text
  of your multiline string.
  $var
EOT;

Heredoc ve Nowdoc arasındaki fark, bir heredoc içine gömülü PHP kodunun yürütülmesidir, Nowdoc'daki PHP kodu ise yazdırılacaktır.

$var = "foo";
$text = <<<'EOT'
  My $var
EOT;

Bu durumda $ text değeri olacaktır My $var.

Not: kapanmadan önce EOT;boşluk veya sekme olmamalıdır. aksi takdirde bir hata alırsınız


Neden? Çünkü birinci EOT ve ikincisi arasındaki her şey olduğu gibi bir dize olarak kabul edilir. Bu, çok satırlı dizelerinizin üzerine ters eğik çizgi n koymanıza gerek olmadığı anlamına gelir. @Fabian: HEREDOC ve NOWDOC arasındaki fark nedir, yoksa aynı şey mi?
Kenny Drobnack

4
@powtac: Hayır, çünkü bir yorumcuya son vermek için yeni bir satırda olması gerekiyor. Özellikle, EOT;önünde boşluk olmamalıdır .
Powerlord

Nowdoc için bir açıklama ekledim.
halfdan

6
@halfdan, Bir şey mi kaçırıyorum? Basitçe "Enter" tuşunu yazıp çok satırlı dizeyi normal bir dize gibi tırnak işaretleri içine alabildiğimizde neden yorumlu metinler ve nowdocs ile uğraşalım ?
Pacerier

3
Lütfen bunu cevabınıza ekleyin: sondan önce EOT;boşluk veya sekme olmamalıdır. aksi takdirde bir hata alırsınız.
Shnd

44

Ben pix0r gibi benzer bir sistem kullanın ve bu kodu oldukça okunabilir hale düşünüyorum. Bazen aslında satır sonlarını çift tırnak içinde ayırmak ve dizenin geri kalanı için tek tırnak kullanmak kadar ileri gider. Bu şekilde, metnin geri kalanından öne çıkarlar ve çift tırnaklı dizeye enjekte etmek yerine birleştirme kullanırsanız değişkenler de daha iyi görünür. Orijinal örneğinizle böyle bir şey yapabilirim:

$text = 'Hello ' . $vars->name . ','
      . "\r\n\r\n"
      . 'The second line starts two lines below.'
      . "\r\n\r\n"
      . 'I also don\'t want any spaces before the new line,'
      . ' so it\'s butted up against the left side of the screen.';

return $text;

Satır sonlarıyla ilgili olarak, e-posta ile her zaman \ r \ n kullanmalısınız. PHP_EOL, php'nin üzerinde çalıştığı işletim sisteminde kullanılması amaçlanan dosyalar içindir.


IDE'nizde bu girintiyi ayarladınız mı (her bir bölüme hizalanmış çok satırlı dize ayarlamak için)?
Krzysztof Trzos

25

Uzun metin için şablonlar kullanıyorum:

email-template.txt içeriği

hello {name}!
how are you? 

PHP bunu yapmak:

$email = file_get_contents('email-template.txt');
$email = str_replace('{name},', 'Simon', $email);

ilginç ... şablonlarınızı bir web uygulamasının dizin yapısında nerede saklıyorsunuz?
Andrew

Kodum sadece bir demo. Büyük bir web uygulaması için / templates / e-postalar /, / templates / userfeedback / gibi bir yapı kullanabilirsiniz. Ama daha fazla şeyiniz varsa SMARTY gibi tam bir şablon sistemi öneriyorum.
powtac

Dwoo dwoo.org , bazıları iyi bir halefi ( PHP5'te başladı, bu yüzden PHP4 bagajı yok) düşünen iyi bir SMARTY uyumlu PHP şablonlama sistemidir.
micahwittman

19

Dizenin içine \nve / veya \rortasına ekleme ve ikinci örnekte olduğu gibi çok uzun bir kod satırına sahip olmak doğru gelmiyor: kodu okuduğunuzda sonucu görmüyorsunuz ve kaydırmanız gerekiyor .

Bu tür durumlarda her zaman Heredoc kullanıyorum (Veya PHP> = 5.3 kullanıyorsanız Nowdoc) : yazması kolay, okunması kolay, süper uzun satırlara gerek yok, ...

Örneğin :

$var = 'World';
$str = <<<MARKER
this is a very
long string that
doesn't require
horizontal scrolling, 
and interpolates variables :
Hello, $var!
MARKER;

Sadece bir şey: son işaretleyici (ve ;ondan sonra ' ') satırındaki tek şey olmalı: önce veya sonra boşluk / sekme yok!


12

Elbette, HEREDOC'u kullanabilirsiniz, ancak kod okunabilirliği söz konusu olduğunda, dizeyi birden çok satıra sarıp ilk örnekten daha iyi değildir.

Çok satırlı dizenizin iyi görünmesini ve kodunuzla iyi akmasını istiyorsanız, dizeleri bir araya getirmenizi tavsiye ederim:

$text = "Hello, {$vars->name},\r\n\r\n"
    . "The second line starts two lines below.\r\n"
    . ".. Third line... etc";

Bu, HEREDOC veya çok satırlı bir dizeden biraz daha yavaş olabilir, ancak kodunuzun girintisiyle iyi akar ve okumayı kolaylaştırır.


9

Javascript için bu yöntemi biraz daha seviyorum ama henüz belirtilmemiş çünkü buraya dahil etmeye değer görünüyor.

$var = "pizza";

$text = implode(" ", [
  "I love me some",
  "really large",
  $var,
  "pies.",
]);

// "I love me some really large pizza pies."

Daha küçük şeyler için, sıralı dizelerle karşılaştırıldığında dizi yapılarıyla çalışmanın daha kolay olduğunu düşünüyorum.

İlgili: implode vs concat performans


1

Buna inanan

"abc\n" . "def\n"

çok satırlı dize yanlış. Bu, çok satırlı bir dize değil, birleştirme operatörüne sahip iki dize. Bu tür birleştirilmiş dizeler, örneğin önceden tanımlanmış dizilerin anahtarları olarak kullanılamaz. Ne yazık ki php şeklinde gerçek çok satırlı dizeleri sunmuyor

"abc\n"
"def\n"

yalnızca HEREDOCve NOWDOCsözdizimi, ki bu şablonlar için daha uygundur, çünkü iç içe kod girintisi bu sözdizimi tarafından kesilir.


1

Ayrıca kullanabilirsiniz:

<?php
ob_start();
echo "some text";
echo "\n";

// you can also use: 
?> 
some text can be also written here, or maybe HTML:
<div>whatever<\div>
<?php
echo "you can basically write whatever you want";
// and then: 
$long_text = ob_get_clean();


0

ama yeni hatlar ve satır başı ile olan anlaşma nedir? Fark ne? \ N \ n \ r \ r veya \ n \ r eşdeğeri mi? Çizgiler arasında çizgi boşluğu oluştururken hangisini kullanmalıyım?

Buradaki hiç kimse bu soruya gerçekten cevap vermedi, bu yüzden buradayım.

\r 'taşıma-dönüşü' temsil eder

\n 'satır beslemeyi' temsil eder

Onların asıl nedeni daktilolara geri dönüyor. Siz yazarken, 'satır başı' yavaşça, karakter karakter, daktilonun sağında kayar. Eğer hattın sonuna geldiğimde sen olur taşıyıcıyı döndürmek ve sonra yeni bir satıra gidin . Yeni satıra gitmek için satırları tür yazara besleyen bir kolu çevirirsiniz . Bu nedenle, bu eylemlere, birleşik dönüş hattı besleme denir . Kelimenin tam anlamıyla:

Bir satır besleme, bir \nsonraki satıra geçme anlamına gelir.

Bir satır başı,, \rimleci satırın başına taşıma anlamına gelir.

Sonuçta Hello\n\nWorldekranda aşağıdaki çıktı ile sonuçlanmalıdır:

Hello

     World

Nerede olduğu gibi aşağıdaki çıktı ileHello\r\rWorld sonuçlanmalıdır .

Sadece 2 karakteri birleştirirken \r\n, ortak satırda bilgi sahibi olursunuz. IE Hello\r\nWorldşunlarla sonuçlanmalıdır:

Hello
World

Ve tabii ki \n\raynı görsel çıktı ile sonuçlanacaktır \r\n.

Başlangıçta bilgisayarlar aldı \rve \nkelimenin tam anlamıyla. Ancak bu günlerde taşıma iadesi desteği seyrek. Genellikle her sistemde \nkendi başınıza kullanmaktan kurtulabilirsiniz . Asla işletim sistemine bağlı değildir, ancak çıktıyı ne görüntülediğinize bağlıdır.

Yine de \r\nher zaman mümkün olan her yerde kullanmanızı tavsiye ederim!

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.