En İyi Uygulamalar: PHP uzun, çok satırlı dizeleri ile çalışıyor?

7 Cevap

Not: Bu son derece basit bir soru ise özür dilerim ama benim kod biçimlendirme üzerinde biraz obsesif kompulsif değilim.

Ben bir e-posta gövde metnini yukarı yapacak bir dize döndüren bir işlevi olan bir sınıf var. Ben e-posta doğru görünüyor, ama aynı zamanda bu yüzden benim kod korkak görünmesi değil böylece bu metin biçimlendirilmiş istiyorum. İşte ne demek istediğimi:

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;
    }
}

: ama aynı zamanda gibi yazılmış olabilir

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;
}

ancak yeni hatlar ve satırbaşları ile anlaşma nedir? Ne fark eder ki? \r\r ve \n\n, eşdeğer ya da \n\r mı? Ben hatları arasında bir çizgi boşluk oluşturarak olduğumda hangi kullanmalıyım?

Sonra çıktı tamponlama ve heredoc sözdizimi seçenek var.

Nasıl nesneleri uzun satırlı dizeleri kullanarak başa çıkabiliriz?

7 Cevap

Ben pix0r benzer sistemi kullanmak ve ben bu kodu oldukça okunabilir yapar düşünüyorum. Bazen aslında kadarıyla çift tırnak satır sonlarını ayrılması gibi gidip dize geri kalanı için tek tırnak kullanmak istiyorsunuz. Onlar metin ve değişkenlerin diğerlerinden öne Bu şekilde ayrıca birleştirme kullanırsanız daha iyi öne yerine çift tırnaklı dizge içinde bunları enjekte. Yani özgün örnek ile böyle bir şey yapacağım:

$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ı ile ilgili olarak, e-posta ile her zaman \ r \ n kullanmalısınız. PHP_EOL php üzerinde çalışan aynı işletim sisteminde kullanılmak içindir dosyalar içindir.

Siz Yorumlu metin veya yorumsuz metin 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;

Yorumlu metin ve yorumsuz metin arasındaki fark, yorumsuz metin içinde php kodu olarak basılacaktır sırasında bir yorumlu metin gömülü php kod, idam olur olmasıdır.

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

"Benim $ var:" Bu durumda, $ metin değerine sahip olacaktır.

Best wishes, Fabian

Ben uzun metin için şablonlar kullanmak:

e-posta template.txt içeriyor

hello {name}!
how are you?

PHP bunu:

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

Tabii, heredoc kullanabilirsiniz, ama kadarıyla kod okunabilirliği gider gibi birden çok hatları üzerinden dize sarma, gerçekten ilk örnekte daha iyi değil.

Gerçekten çok satırlı dize iyi bakmak ve kod ile iyi akmasını istiyorsanız, birlikte olduğu gibi dizeleri bitiştirmek tavsiye ederim:

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

Bu Yorumlu metin veya çok satırlı bir dize biraz daha yavaş olabilir, ama bu kodun girinti ile iyi akacak ve kolay okunmasını sağlamak olacaktır.

Dize ortasında \n ve / veya \r ekleme ve ikinci örnekteki gibi bir kod çok uzun bir çizgi, sahip, sağ hissediyorum değildir: Eğer kodu okurken , Eğer sonuç görmüyorum, ve kaydırma yapmak zorunda.

Yazmak kolay, okunması kolay, süper-uzun hatlar için gerek ...: durumlarda bu tür, hep yorumlu metin (Or Nowdoc, if using PHP >= 5.3) kullanın

Ö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: (ondan sonra ve ';') end marker kendi satırında tek şey olması gerekir: hiçbir boşluk / sekme önce veya sonra!

Inanıyor biri

"abc\n" . "def\n"

satırlı dize yanlış olur. Bu birleştirme operatörü değil, bir çok satırlı dize ile iki dizeleri var. Bu gibi birleştirilmiş şeritler, örneğin, önceden belirlenmiş dizilerin şifreler olarak kullanılamaz. Ne yazık ki php form gerçek satırlı dizeleri sunmuyor

"abc\n"
"def\n"

geçmiş kod girinti, sözdizimi tarafından bozuldu çünkü, şablonları için daha uygun olduğunu sadece yorumlu metin ve newdoc sözdizimi.

Satırsonlarının ve satırbaşı ilgili sorunuza gelince:

Herhangi bir çapraz platform uyumluluğu sorunlarını çözecek gibi önceden tanımlanmış küresel sabit PHP_EOL kullanarak öneriyoruz.

Bu soru SO üzerinde önceden gündeme gelmiştir ve okuyarak "When do I use the PHP constant PHP_EOL" daha fazla bilgi bulabilirsiniz