2010-02-21 13 views
14

के साथ हस्तक्षेप करना मुझे हेरडोक वाक्यविन्यास पसंद है, उदा। जेनरेट किए गए HTML के किनारे के मामलों के लिए जो टेम्पलेट में डालने योग्य नहीं हैं।हेरडोक कोड इंडेंटेशन

एकमात्र चीज जो मुझे इसके बारे में परेशान करती है, यह है कि सामग्री, और हेरेडोक स्ट्रिंग का समापन मार्कर पहले कॉलम का पालन करता है। यह नेस्टेड कोड लेआउट को खराब करता है:

class myclass 
{ 

    function __construct() 
     { 
     $a = some_code(); 
     $b = some_more_code(); 
     $x = <<<EOT 

line1 
line2 
line3 
line4 

EOT;  

     $c = even_more_code(); 
     $b = still_more_code(); 
     ... 
     ... 
     ... 

आप देखते हैं कि मेरा क्या मतलब है।

अब यह सामान्य हेरडोक का उपयोग करके हल करने योग्य नहीं है। क्या किसी ने इस के आसपास काम किया है? मेरा सपना स्वचालित इंडेंटेशन के साथ हेरडोक सिंटैक्स होगा। लेकिन मुझे लगता है कि स्रोत फ़ाइलों के लिए कुछ प्री-कंपाइलर लिखने के बिना यह संभव नहीं है।

क्या मैं सही हूँ?

उत्तर

11

एक समस्या मैं अक्सर भी है है कि: कोड जब मैं हियरडॉक उपयोग करें, और मैं वास्तव में :-(

जब आप कोड की एक पूरी ब्लॉक का चयन एक "बड़ा" समस्या यह है हियरडॉक की तरह अच्छी तरह से दांतेदार नहीं है, "टैब" (या आपके आईडीई में कोई समकक्ष) इसे और अधिक इंडेंट करने के लिए दबाएं क्योंकि आपने इसे या किसी भी चीज़ के आसपास एक शर्त जोड़ा है ... और यह हेड्रोक तारों को तोड़ देता है: आपको उन्हें हाथ से अनदेखा करना होगा :-(

दुर्भाग्य से, मैं कभी नहीं एक आप का वर्णन कर रहे हैं जैसे किसी भी उपकरण ... देखा है


मुझे लगता है कि एक समाधान, हेड्रोक स्ट्रिंग को किसी अन्य फ़ाइल में रखना होगा, और इसे शामिल करना होगा - इसमें सामान्य रूप से इंडेंट किया जा सकता है; लेकिन इसका मतलब यह भी होगा कि लोड करने के लिए एक और फाइल है, जिससे कोड कम स्पष्ट हो जाएगा।

+0

यूप, एक और फाइल समेत बहुत अधिक भ्रम लाता है ... मैं सीएसएस के लिए कम "प्री-कंपाइलर" बनाने के बारे में सोच रहा हूं, लेकिन यह बहुत कम लाभ के लिए एक प्रयास (और एक अतिरिक्त कदम) लगता है । बहुत बुरा! –

+6

किसी भी प्रकार के "प्री-कंपाइलर" का उपयोग करने का अर्थ यह भी होगा कि जो कोड आप लिखते हैं और देखते हैं * (आपके आईडीई/संपादक में) * वह कोड नहीं है जो निष्पादित हो जाता है - और यह भ्रम का स्रोत होगा, एक दिन या दूसरा ... –

+0

ऑफ-विषय: मैं एक ऐसे संपादक का उपयोग करने का सुझाव देता हूं जिसमें ऑटो-इंडेंट कोड के लिए सभ्य पार्सिंग क्षमताएं हों। अच्छी आईडीई (जैसे कि phpStorm) आपको स्पष्ट रूप से टैब लिखते समय भी हेरडोक बंद टैग को इंडेंट करने की अनुमति नहीं देते हैं। – TheOperator

6

एफवाईआई, यह आपकी समस्या का समाधान नहीं करता है, लेकिन रूबी प्रोग्रामिंग भाषा इंडेंटेड हेडॉक्स का समर्थन करती है।

आप PHP devs को एक फीचर अनुरोध भेजना चाहते हैं, और रूबी दस्तावेज़ों का सबूत के उदाहरण के रूप में उपयोग करें कि एक मौजूदा भाषा इस समस्या को हल करती है, तो PHP भी क्यों नहीं?

2

आप PHP में heredocs या nowdocs पहचान नहीं सकते हैं।

function foo() { 
    $a = 123; 
    $b = 456; 
    $sum = $a + $b; 
    $html = " 
     <div> 
     <h1>sum a, b</h1> 
     Number a is $a, number b is $b<br> 
     a+b equals <b>$sum<b> 
     </div> 
    "; 
    echo $html; 
} 

यह उत्पन्न एचटीएमएल कोड को रिक्त स्थान कहते हैं, लेकिन यदि आप mod_pagespeed या इसी तरह की अपाचे mods उपयोग करते हैं, अपने सर्वर सभी अनावश्यक रिक्त स्थान को हटा देगा: यह मेरा समाधान नहीं है।

function bar($sql, $id) { 
    $q= " 
     SELECT 
     name 
     , address 
     , phone 
     FROM users 
     WHERE id = '$id' -- possible mysql inyection 
     LIMIT 1 
    "; 
    $sql->query($q); 
} 

पठनीयता में कोड लाभ:

आप बहु पंक्ति एसक्यूएल प्रश्नों के लिए उसी तकनीक का उपयोग कर सकते हैं। इसका प्रदर्शन में कोई प्रभाव नहीं पड़ता है और आप कॉम्पेक्स एसक्यूएल प्रश्नों (# या - 0) के साथ टिप्पणी कर सकते हैं

+2

इस दृष्टिकोण का नकारात्मक पक्ष यह है कि डबल कोट्स से बच जाना चाहिए। – Tag

1

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

  $html = <<< HTML     //indented line 
               //leave this line empty 
      <div>        //indented line 
       <div>$variable</div>   //indented line 
      </div>        //indented line 
HTML;           //no white space, not indented 
+1

मैंने इस जवाब को संशोधन 1 में वापस ले लिया। @bgs द्वारा किए गए संपादन पूरी तरह से उस बिंदु को नष्ट कर दिया जो वेस बनाने की कोशिश कर रहा था। –

0

मैंने एक ऐसा फ़ंक्शन लिखा जो आपको आपकी इच्छानुसार इंडेंट करने की अनुमति देता है। यह वास्तव में एक बहुत ही सरल काम है। https://github.com/chiedolabs/moon-walk-php

मुझे यह पसंद है क्योंकि मेरा कोड इस तरह से साफ रहता है।

+0

क्या मैं आपको निम्नलिखित मेटा पोस्ट की समीक्षा करने के लिए कह सकता हूं? [व्यक्तिगत ओपन-सोर्स लाइब्रेरीज़ कैसे पेश करें?] (Https://meta.stackexchange.com/q/229085) –

+0

हाँ, बस @MartijnPieters पढ़ें! – Chiedo

+1

* चांदवाक के साथ: * आपके गिटहब पेज पर उदाहरण विकृत है। हेरडोक के लिए समापन टैग लाइन की शुरुआत में दिखाई देना चाहिए, इंडेंटेशन संभव नहीं है। – TheOperator

संबंधित मुद्दे