PHP में heredoc का उपयोग करने का क्या फायदा है? [बन्द है]


196

PHP में heredoc का उपयोग करने का क्या फायदा है , और क्या आप एक उदाहरण दिखा सकते हैं?


4
ऐसा कोई मजबूत कारण नहीं है कि विकल्प heredocs से बेहतर हो
शक्ति सिंह

18
मैंने इसे अधिक रचनात्मक होने के लिए संपादित किया है, और प्रश्न समुदाय विकि को बनाया है क्योंकि यह काफी व्यक्तिपरक है। ध्यान दें, समुदाय अभी भी इसे बंद कर सकता है, मैंने इसे खुला छोड़ने के लिए चुना क्योंकि आपको गुणवत्ता उत्तर मिल रहे हैं।
टिम पोस्ट

9
वास्तव में इस प्रश्न को रचनात्मक क्यों नहीं माना जाता है?
Ambo100

जवाबों:


218

Heredoc सिंटैक्स मेरे लिए बहुत क्लीनर है और यह बहु-पंक्ति स्ट्रिंग्स के लिए वास्तव में उपयोगी है और मुद्दों को उद्धृत करने से बचता है। दिन में वापस मैं उन्हें एसक्यूएल प्रश्नों का निर्माण करने के लिए इस्तेमाल किया:

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

मेरे लिए उद्धरण चिह्नों का उपयोग करने की तुलना में वाक्य रचना त्रुटि को पेश करने की कम संभावना है:

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

उपरोक्त के साथ pProblem वाक्यविन्यास त्रुटि है (गायब बची हुई बोली) मुझे यहाँ दस्तावेज़ वाक्य विन्यास के विपरीत प्रस्तुत किया गया है:

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

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

  • एकल उद्धरण का उपयोग तब किया जाता है जब स्ट्रिंग एक स्थिर जैसा होता है'no variables here'
  • जब मैं एक लाइन पर स्ट्रिंग रख सकता हूँ और चर प्रक्षेप या एक एम्बेडेड एकल उद्धरण की आवश्यकता होती है तो दोहरे उद्धरण"Today is ${user}'s birthday"
  • यहां मल्टी-लाइन स्ट्रिंग्स के लिए दस्तावेजों की आवश्यकता होती है जो स्वरूपण और परिवर्तनशील प्रक्षेप की आवश्यकता होती है।

40
अपने SQL उदाहरण पर Nitpick: आपको पहले स्थान पर दोहरे उद्धरण चिह्नों का उपयोग नहीं करना चाहिए। यह केवल MySQL के साथ काम करता है, और केवल तभी जब सर्वर --ansiअनुपालन मोड में नहीं चलता है। SQL स्ट्रिंग्स को एकल उद्धरण का उपयोग करना चाहिए
मारियो

17
@ मोरियो यह समस्या के चित्रण के लिए थी जिसमें सामान्य रूप से दोहरे उद्धरण चिह्नों का उपयोग नहीं किया गया था जो कि वर्ग की विशिष्टता के बारे में नहीं है
वेस

4
यह कहने के लिए नहीं कि चर को सीधे क्वेरी में रखना एक बुरा, खराब शिष्टाचार है :-P
योर कॉमन सेंस

5
@ और @ उमियो यह एएनएसआई एसक्यूएल है:SELECT * FROM "order" WHERE "table"='1'
प्रोग्रामपथ

11
"यह कहने के लिए नहीं कि चर को सीधे क्वेरी में रखना एक बुरा, खराब शिष्टाचार है"। यह बिल्कुल भी सच नहीं है। गैर-मान्य इनपुट को SQL स्टेटमेंट में रखना "खराब मैनर्स" है। SQL स्टेटमेंट के अंदर वैरिएबल को रखना कभी-कभी आवश्यक होता है।
वोगोमैटिक्स

67

बढ़ी हुई पठनीयता और स्थिरता के कारण हेरेडोक उद्धृत तारों का एक बेहतरीन विकल्प है। आपको उद्धरण और (अच्छे) आईडीई से बचने की जरूरत नहीं है या पाठ संपादक उचित सिंटैक्स हाइलाइटिंग का उपयोग करेंगे।

एक बहुत ही सामान्य उदाहरण: PHP के भीतर से HTML बाहर गूँज रहा है:

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

// Sometime later
echo $html;

यह पढ़ना आसान है और बनाए रखना आसान है।

विकल्प उद्धृत स्ट्रिंग की गूंज है, जो समाप्त होने वाले उद्धरण से युक्त है और IDEs उस भाषा के लिए वाक्यविन्यास को उजागर नहीं करने जा रहे हैं, जिससे खराब पठनीयता और रखरखाव में अधिक कठिनाई होती है।

आपके सामान्य ज्ञान का अद्यतन उत्तर

बेशक आप HTML के रूप में हाइलाइट की गई SQL क्वेरी नहीं देखना चाहेंगे। अन्य भाषाओं का उपयोग करने के लिए, बस वाक्य रचना में भाषा बदलें:

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

1
क्या आपको पता है कि PHP की " PHP से बच " सुविधा है?
आपका कॉमन सेंस

5
PHP से बचना कभी-कभी ठीक होता है, लेकिन जब आप बहुत सारा सामान गूँज रहे होते हैं, तो आपका सिंटैक्स हाइलाइटिंग टूट जाता है, आपको PHP से सरल बचकर अधिक वर्ण टाइप करना पड़ता है और PHP में एक ही प्रतिध्वनि के बजाय निष्पादित करने की अधिक आज्ञा होती है। इसके अलावा, आप एक हेरेडोक स्ट्रिंग को एक चर में सेट कर सकते हैं और बाद में इसे प्रतिध्वनित कर सकते हैं। अपने HTML के लिए PHP को बचाना मतलब यह तब और वहाँ मुद्रित हो जाता है। इसे बाद के लिए सहेज नहीं सकते।
जेक विल्सन

2
1. आउटपुट बचाने के लिए आप आउटपुट बफरिंग का उपयोग कर सकते हैं। 2. आप अपने पहले उदाहरण में प्रतिध्वनि का उपयोग कर रहे थे। 3. (अच्छा) आईडीई या टेक्स्ट एडिटर कभी भी एचटीएमएल को उजागर नहीं करते हैं जब आप PHP से भागने का उपयोग कर रहे होते हैं। 4. HEREDOC के लिए वाक्य रचना किस IDE पर प्रकाश डालती है और किस भाषा के नियमों का उपयोग किया जाता है? क्या HTML टेक्स्ट के रूप में हाइलाइट की गई SQL क्वेरी को देखना ठीक है?
आपका कॉमन सेंस

1
एक हेरेडोक एक PHP स्ट्रिंग है। बेशक आप एक स्ट्रिंग में नियंत्रण संरचनाओं का उपयोग नहीं कर सकते। php.net/manual/en/language.types.string.php
जेक विल्सन

11
मुझे लगता है कि आपको Heredoc की गलतफहमी केवल HTML के तार पर लागू होती है। हेरेडोक बस एक स्ट्रिंग को परिभाषित करने का एक वैकल्पिक तरीका है, चाहे वह एचटीएमएल हो या एसक्यूएल क्वेरी या कुछ भी आप चाहते हैं। वे लिखना आसान है और बनाए रखना चाहते हैं, ऊपर वेस के उत्तर से पता चलता है कि काफी स्पष्ट रूप से (यदि आपने ध्यान दिया है कि सही सिंटैक्स हाइलाइटिंग है। मुझे नेटबैंस के बारे में शिकायत न करें)। मुझे यकीन नहीं है कि आप एक समुदाय विकी सवाल पर एक जवाब को वोट देने पर इतना झुक क्यों रहे हैं ... मानो या न मानो, मूल PHP डेवलपर्स ने हेरेडोक को पीएचपी में शामिल किया हो सकता है क्योंकि यह वास्तव में कुछ मामलों में उपयोगी हो सकता है .. ।
जेक विल्सन

8

कुछ आईडीई कोड को हाइरेडॉक स्ट्रिंग्स में स्वचालित रूप से हाइलाइट करते हैं - जो एक्सएमएल या एचटीएमएल के लिए हेरेडोक का उपयोग नेत्रहीन अपील करता है।

मैं व्यक्तिगत रूप से इसे यानी XML के लंबे हिस्सों के लिए पसंद करता हूं क्योंकि मुझे उद्धरण वर्णों को उद्धृत करने की परवाह नहीं है और बस XML को पेस्ट कर सकते हैं।


6

सबसे पहले, सभी कारण व्यक्तिपरक हैं। यह एक कारण के बजाय स्वाद के मामले की तरह अधिक है।

व्यक्तिगत रूप से, मुझे हेरेडोक काफी बेकार लगता है और इसका उपयोग कभी-कभार किया जाता है, अधिकांश समय जब मुझे कुछ HTML प्राप्त करने की आवश्यकता होती है और उदाहरण के लिए HTML ईमेल संदेश बनाने के लिए आउटपुट बफरिंग से परेशान नहीं होना चाहता।

फ़ॉर्मेटिंग सामान्य इंडेंटेशन नियमों के अनुकूल नहीं है, लेकिन मुझे नहीं लगता कि यह एक बड़ी बात है।

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

स्वीकृत उत्तर में उदाहरणों के लिए, यह केवल धोखा है।
स्ट्रिंग उदाहरण, वास्तव में, अधिक संक्षिप्त होने पर अगर कोई उन पर धोखा नहीं देगा

$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

मुझे नहीं पता कि मैं कहूंगा कि आनुवंशिकता आलस्य है। कोई कह सकता है कि कुछ भी करना आलस्य है, क्योंकि कुछ भी करने के लिए हमेशा अधिक बोझिल तरीके होते हैं।

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

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