सर्वोत्तम प्रथाएँ: PHP में लंबे, बहुपरत तारों के साथ काम करना?


177

नोट: मुझे खेद है अगर यह एक बहुत ही सरल प्रश्न है लेकिन मैं अपने कोड के प्रारूपण पर कुछ जुनूनी बाध्यकारी हूं।

मेरे पास एक वर्ग है जिसमें एक फ़ंक्शन होता है जो एक स्ट्रिंग देता है जो एक ईमेल का मुख्य पाठ बना देगा। मैं चाहता हूं कि यह पाठ स्वरूपित हो, इसलिए यह ईमेल में सही लगता है, लेकिन यह भी ऐसा नहीं है कि यह मेरे कोड को मजेदार बना देता है। यहाँ मेरा मतलब है:

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

लेकिन यह भी लिखा जा सकता है:

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

लेकिन नई लाइनों और कैरिज रिटर्न के साथ सौदा क्या है? क्या फर्क पड़ता है? है \n\nके बराबर \r\rया \n\r? जब मैं लाइनों के बीच एक लाइन गैप बना रहा हूं तो मुझे किसका उपयोग करना चाहिए?

फिर आउटपुट बफरिंग और हेरेडोक सिंटैक्स का विकल्प है।

आप अपनी वस्तुओं में लंबे मल्टीलाइन स्ट्रिंग्स के उपयोग से कैसे निपटते हैं?


3
मुझे हमेशा लगता था कि OS / X से पहले Mac में ऑन लाइन में Unix \ r न्यूलाइन है, और \ r \ n विंडोज पर न्यूलाइन है। इसके अलावा, यह देखते हुए कि यह एक स्ट्रिंग है जो एक ईमेल संदेश में दिखाई देता है, आप यह सुनिश्चित करना चाहेंगे कि जो भी आप कर रहे हैं वह अधिकांश कमांड मेल क्लाइंट पर सही ढंग से दिखाता है। संकेत: आउटलुक कुछ मामलों में अतिरिक्त न्यूलाइन वर्णों को हटा देता है, इसलिए आपको हमेशा वह नहीं मिलेगा जो आप अपेक्षा करते हैं।
केनी ड्रोबनैक 19

1
यकीन नहीं है कि यह सब महत्वपूर्ण है, लेकिन मूल रूप से दो 'न्यूलाइन' अक्षर तब से आए जब आपके पास एक भौतिक टाइपराइटर था जिसमें दो पात्रों का उपयोग किया गया था। पृष्ठ के बाएं हाथ की ओर (CR - 0xD) के लिए गाड़ी वापस डालने के लिए एक, और एक जिसने पृष्ठ को अगली पंक्ति (LF - 0xA) पर जाने का कारण बनाया। मुझे यकीन है कि ऐसे लोग हैं जो इस बारे में अधिक जानते हैं। तथापि।
mkgrunder

जवाबों:


289

आपको HEREDOC या NowDOC का उपयोग करना चाहिए।

$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 और Nowdoc के बीच अंतर यह है कि heredoc में एम्बेड किया गया PHP कोड निष्पादित हो जाता है, जबकि Nowdoc में PHP कोड उसी के अनुसार प्रिंट किया जाएगा।

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

इस मामले में $ पाठ का मूल्य होगा My $var

नोट: बंद होने से पहले EOT;कोई स्थान या टैब नहीं होना चाहिए। अन्यथा आपको एक त्रुटि मिलेगी


क्यों? क्योंकि पहले EOT और दूसरे के बीच का सब कुछ एक स्ट्रिंग माना जाता है। जिसका मतलब है कि आपको अपने मल्टी-लाइन स्ट्रिंग्स पर बैकस्लैश एन लगाने की आवश्यकता नहीं है। @ फ़ेबियन: एक HEREDOC और NowDOC में क्या अंतर है, या वे एक ही चीज़ हैं?
केनी ड्रोबनैक

4
@powtac: नहीं, क्योंकि यह एक वंशानुगत को समाप्त करने के लिए एक नई लाइन पर होना चाहिए। विशेष रूप से, इसके EOT;पहले कोई रिक्त स्थान नहीं होना चाहिए ।
पॉवरलॉर्ड

मैंने नॉवडॉक के लिए एक स्पष्टीकरण जोड़ा है।
अर्धदिनांक

6
@फ़्लर्डन, क्या मुझे कुछ याद आ रहा है? जब हम बस "एन्टर" कुंजी टाइप कर सकते हैं और बहु-पंक्ति स्ट्रिंग को सामान्य स्ट्रिंग की तरह घेर सकते हैं, तो हेरेडोक्स और नॉवडोक से परेशान क्यों ?
पचेरियर

3
कृपया इसे अपने उत्तर में जोड़ें: अंतिम से पहले EOT;कोई स्थान या टैब नहीं होना चाहिए। अन्यथा आपको एक त्रुटि मिलेगी।
शाद

44

मैं Pix0r के समान सिस्टम का उपयोग करता हूं और मुझे लगता है कि यह कोड को काफी पठनीय बनाता है। कभी-कभी मैं वास्तव में डबल कोट्स में लाइन ब्रेक को अलग करने के रूप में दूर जाता हूं और बाकी स्ट्रिंग के लिए सिंगल कोट्स का उपयोग करता हूं। इस तरह वे बाकी पाठ से बाहर खड़े हो जाते हैं और चर भी बेहतर हो जाते हैं यदि आप दोहरे उद्धरण के अंदर उन्हें इंजेक्ट करने के बजाय कॉन्टेक्शन का उपयोग करते हैं। इसलिए मैं आपके मूल उदाहरण के साथ ऐसा कुछ कर सकता हूं:

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

लाइन ब्रेक के संबंध में, ईमेल के साथ आपको हमेशा \ r \ n का उपयोग करना चाहिए। PHP_EOL उन फ़ाइलों के लिए है, जिनका उपयोग उसी ऑपरेटिंग सिस्टम में किया जाना है, जिस पर php चल रहा है।


क्या आपने अपनी आईडीई में इंडेंटेशन निर्धारित किया है (प्रत्येक भाग के लिए संरेखित बहुस्तरीय स्ट्रिंग सेट करने के लिए)?
Krzysztof Trzos

25

मैं लंबे पाठ के लिए टेम्प्लेट का उपयोग करता हूं:

ईमेल- template.txt में सम्‍मिलित है

hello {name}!
how are you? 

PHP में मैं यह करता हूँ:

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

दिलचस्प ... आप वेब एप्लिकेशन की निर्देशिका संरचना में अपने टेम्पलेट कहां संग्रहीत करते हैं?
एंड्रयू

मेरा कोड सिर्फ एक डेमो है। एक विशाल वेब ऐप के लिए आप एक संरचना का उपयोग कर सकते हैं जैसे / टेम्प्लेट / ईमेल /, / टेम्प्लेट / यूजरफीडबैक /। लेकिन अगर आपके पास अधिक सामान है तो मैं SMARTY जैसे पूर्ण टेम्पलेट सिस्टम की सिफारिश करूंगा।
पौव्वत

Dwoo dwoo.org एक सभ्य स्मार्ट -संगत PHP टेम्प्लेटिंग सिस्टम है, जिसे कुछ एक अच्छा उत्तराधिकारी मानते हैं (PHP5 पर शुरू हुआ, इसलिए कोई PHP4 सामान नहीं है)।
माईकविटमैन

19

जोड़ने \nऔर / या \rस्ट्रिंग के बीच में, और कोड की एक बहुत लंबी लाइन होने, दूसरे उदाहरण में, सही नहीं लगता है: जब आप कोड पढ़ते हैं, तो आप परिणाम नहीं देखते हैं, और आपको स्क्रॉल करना होगा ।

इस तरह की स्थितियों में, मैं हमेशा Heredoc (या Nowdoc, अगर PHP> = 5.3 का उपयोग करता हूं ) का उपयोग करता हूं : लिखने में आसान, पढ़ने में आसान, सुपर-लंबी लाइनों की आवश्यकता नहीं, ...

उदाहरण के लिए :

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

बस एक चीज: अंतिम मार्कर (और उसके ;बाद का ') इसकी लाइन की एकमात्र चीज होनी चाहिए: पहले या बाद में कोई स्पेस / टैब नहीं!


12

ज़रूर, आप HEREDOC का उपयोग कर सकते हैं, लेकिन जहाँ तक कोड पठनीयता जाती है, यह वास्तव में पहले उदाहरण से बेहतर नहीं है, स्ट्रिंग को कई लाइनों में लपेटकर।

यदि आप वास्तव में चाहते हैं कि आपकी मल्टी-लाइन स्ट्रिंग अच्छी दिखे और आपके कोड के साथ अच्छी तरह से प्रवाहित हो, तो मैं आपको एक साथ स्ट्रैटनिंग करने की सलाह दूंगा:

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

यह HEREDOC या एक बहु-पंक्ति स्ट्रिंग की तुलना में थोड़ा धीमा हो सकता है, लेकिन यह आपके कोड के इंडेंटेशन के साथ अच्छी तरह से प्रवाह करेगा और इसे पढ़ना आसान बना देगा।


9

मैं इस पद्धति को जावास्क्रिप्ट के लिए थोड़ा अधिक पसंद करता हूं, लेकिन यह यहां शामिल होने के लायक है क्योंकि यह अभी तक उल्लेख नहीं किया गया है।

$var = "pizza";

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

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

छोटी चीज़ों के लिए, मुझे लगता है कि समवर्ती तारों की तुलना में सरणी संरचनाओं के साथ काम करना अक्सर आसान होता है।

संबंधित: निहित प्रदर्शन


1

जो ऐसा मानता है

"abc\n" . "def\n"

क्या मल्टीलाइन स्ट्रिंग गलत है। यह दो संचालक के साथ है, न कि मल्टीलाइन स्ट्रिंग। उदाहरण के लिए, इस तरह के संघनित तारों को पूर्व-परिभाषित सरणियों की कुंजी के रूप में उपयोग नहीं किया जा सकता है। दुर्भाग्य से php वास्तविक मल्टीलाइन स्ट्रिंग्स की पेशकश नहीं करता है

"abc\n"
"def\n"

केवल HEREDOCऔर NOWDOCसिंटैक्स, जो टेम्प्लेट के लिए अधिक उपयुक्त है, क्योंकि नेस्टेड कोड इंडेंट ऐसे सिंटैक्स द्वारा टूट जाता है।


1

आप भी उपयोग कर सकते हैं:

<?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

आपके प्रश्नों के संबंध में नई खबरों और गाड़ी के रिटर्न के बारे में:

मैं पूर्वनिर्धारित वैश्विक निरंतर PHP_EOL का उपयोग करने की सलाह दूंगा क्योंकि यह किसी भी क्रॉस-प्लेटफॉर्म संगतता मुद्दों को हल करेगा।

यह सवाल इतने पर कर दी गई है पहले से है और आप पढ़ कर अधिक जानकारी प्राप्त कर सकते हैं " मैं PHP लगातार PHP_EOL प्रयोग करते हैं जब "


1
इस उत्तर के लिए टिप्पणी से पता चलता है कि मुझे ईमेल में नई लाइनों के लिए \ r \ n का उपयोग करना चाहिए: stackoverflow.com/questions/128560/…
एंड्रयू

0

लेकिन नई लाइनों और कैरिज रिटर्न के साथ सौदा क्या है? क्या फर्क पड़ता है? क्या \ n \ n \ r \ r या \ n \ r के बराबर है? जब मैं लाइनों के बीच एक लाइन गैप बना रहा हूं तो मुझे किसका उपयोग करना चाहिए?

यहाँ कोई भी इस प्रश्न का वास्तविक उत्तर नहीं देता था, इसलिए मैं यहाँ हूँ।

\r 'कैरिज-रिटर्न' का प्रतिनिधित्व करता है

\n 'लाइन-फीड' का प्रतिनिधित्व करता है

उनके लिए वास्तविक कारण टाइपराइटर पर वापस जाता है। जैसा कि आपने टाइप किया है 'गाड़ी' धीरे-धीरे स्लाइड करेगी, चरित्र द्वारा चरित्र, टाइपराइटर के दाईं ओर। जब आप लाइन के अंत में पहुँच जाते तो आप गाड़ी वापस कर देते और फिर एक नई लाइन पर जाते । नई लाइन पर जाने के लिए, आप एक लीवर को फ्लिप करेंगे, जिसने टाइप राइटर को लाइनें दी हैं। इस प्रकार, इन कार्यों को संयुक्त, कैरिज रिटर्न लाइन फीड कहा जाता था । तो काफी शाब्दिक:

एक लाइन फीड, का \nमतलब है अगली लाइन पर जाना।

एक गाड़ी वापसी, का \rमतलब है कि लाइन की शुरुआत में कर्सर ले जाना।

अंततः Hello\n\nWorldस्क्रीन पर निम्नलिखित आउटपुट में परिणाम होना चाहिए:

Hello

     World

जहाँ निम्न आउटपुटHello\r\rWorld में परिणाम होना चाहिए ।

यह केवल 2 वर्णों को मिलाते समय है \r\nजो आपके पास ज्ञात लाइन की सामान्य समझ है। IE में Hello\r\nWorldपरिणाम होना चाहिए:

Hello
World

और निश्चित \n\rरूप से के रूप में एक ही दृश्य उत्पादन में परिणाम होगा \r\n

मूल रूप से कंप्यूटर लिया \rऔर \nकाफी शाब्दिक। हालांकि इन दिनों गाड़ी वापसी का समर्थन विरल है। आमतौर पर हर सिस्टम पर आप \nइसके इस्तेमाल से दूर हो सकते हैं । यह कभी भी OS पर निर्भर नहीं करता है, लेकिन यह इस बात पर निर्भर करता है कि आप आउटपुट में क्या देख रहे हैं।

फिर भी मैं हमेशा सलाह \r\nदूंगा कि आप कहीं भी हों!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.