indentation - PHP / HTML मिश्रित कोड को सही ढंग से इंडेंट कैसे करें?




(6)

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

यदि आपको आउटपुट डीबग करने की आवश्यकता है, तो क्रोम डेवलपर टूल्स, फायरबग, या यहां तक ​​कि एफ 12 टूल्स का उपयोग करें।

PHP और HTML मिश्रण करते समय, उपयोग करने के लिए उचित इंडेंटेशन शैली क्या है? क्या मैं इंडेंट करता हूं ताकि आउटपुट एचटीएमएल में सही इंडेंटेशन हो या फिर PHP / HTML मिश्रण ठीक से स्वरूपित दिखता है (और इस प्रकार पढ़ने में आसान है)?

उदाहरण के लिए, कहें कि मेरे पास foreach लूप आउटपुट टेबल पंक्तियां हैं। नीचे कौन सा सही है?

PHP / HTML मिश्रण सही दिखता है:

<table>
  <?php foreach ($rows as $row): ?>
    <tr>
      <?php if ($row->foo()): ?>
        <?php echo $row ?>
      <?php else: ?>
        Something else
      <?php endif ?>
    </tr>
  <?php endforeach ?>
</table>

आउटपुट एचटीएमएल सही दिखता है:

<table>
<?php foreach ($rows as $row): ?>
  <tr>
  <?php if ($row->foo()): ?>
    <?php echo $row ?>
  <?php else: ?>
    Something else
  <?php endif ?>
  </tr>
<?php endforeach ?>
</table>

मैंने पाया है कि जब मैं इस स्थिति में दौड़ता हूं (काफी बार), मेरे पास उपयोग करने के लिए मानक शैली नहीं है। मुझे पता है कि "सही" जवाब नहीं हो सकता है, लेकिन मुझे अन्य डेवलपर्स के विचार सुनना अच्छा लगेगा।


PHP और HTML को प्रत्येक को इंडेंट किया जाना चाहिए ताकि वे स्रोत फ़ॉर्म में स्वयं के संबंध में सही हों, भले ही एक दूसरे के आउटपुट और आउटपुट फॉर्म:

<table>
<?php foreach ($rows as $row): ?>
    <tr>
    <?php if ($row->foo()): ?>
        <?php echo $row ?>
    <?php else: ?>
        Something else
    <?php endif ?>
    </tr>
<?php endforeach ?>
</table>

आप पठनीयता में मदद के लिए हमेशा थोड़ी सी सफेद जगह का उपयोग कर सकते हैं। अराजकता 'इंडेंटेशन पर बिल्डिंग:

<table>

<?php foreach ($rows as $row): ?>

    <tr>

    <?php if ($row->foo()): ?>
        <?php echo $row ?>
    <?php else: ?>

        Something else

    <?php endif ?>

    </tr>

    <?php endforeach ?>

</table

इसका एकमात्र नकारात्मक पक्ष यह है कि यदि आपके पास बहुत सारे मिश्रित कोड हैं तो यह आपके दस्तावेज़ को दो बार लंबा बना सकता है, जो अधिक स्क्रॉलिंग के लिए बनाता है। यद्यपि यदि आपके पास यह मिश्रित कोड है तो आप एक टेम्पलेटिंग इंजन पर विचार करना चाहेंगे।


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

    <table>
<?  foreach ($foo as $bar): ?>
      <tr>
<?    foreach ($bar as $baz): ?>

         <td><?=$baz?></td>

<?    endforeach ?>
      </tr>
<?  endforeach ?>
    </table>

आपको उत्पादन वातावरण में मार्कअप इंडेंटेशन के बारे में परेशान नहीं होना चाहिए। न तो आप टिडी या अन्य एचटीएमएल purifiers का उपयोग करना चाहिए। वैध उपयोग के मामले हैं, उदाहरण के लिए जब आप HTML इनपुट की अनुमति देते हैं (लेकिन इसके बजाय Markdown का Markdown करने पर विचार करें), हालांकि ये दुर्लभ हैं।

कोड के साथ अंतर्निहित मुद्दों को छिपाने के लिए अक्सर HTML beautifiers-filter का दुरुपयोग किया जाता है। मत करो। मैन्युअल रूप से अपना मार्कअप सही करें।

यदि आपको केवल विकास वातावरण में अपना कोड इंडेंट करने की आवश्यकता है, तो आप उपर्युक्त में से किसी एक का उपयोग कर सकते हैं। हालांकि, सावधान रहें कि ये पुस्तकालय आपके मार्कअप को ठीक करने का प्रयास करेंगे (यह उनका प्राथमिक उद्देश्य है; इंडेंटेशन एक उप-उत्पाद है)। मैंने नियमित अभिव्यक्ति आधारित इंडेंटेशन टूल Dindent

डिंडेंट मार्कअप को इस तरह परिवर्तित करेगा:

<!DOCTYPE html>
<html>
<head></head>
<body>
    <script>
    console.log('te> <st');
    function () {
        test; <!-- <a> -->
    }
    </script>
    <div>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <div><table border="1" style="background-color: red;"><tr><td>A cell    test!</td>
<td colspan="2" rowspan="2"><table border="1" style="background-color: green;"><tr> <td>Cell</td><td colspan="2" rowspan="2"></td></tr><tr>
        <td><input><input><input></td></tr><tr><td>Cell</td><td>Cell</td><td>Ce
            ll</td></tr></table></td></tr><tr><td>Test <span>Ce       ll</span></td></tr><tr><td>Cell</td><td>Cell</td><td>Cell</td></tr></table></div></div>
</body>
</html>

इसके लिए:

<!DOCTYPE html>
<html>
    <head></head>
    <body>
        <script>
    console.log('te> <st');
    function () {
        test; <!-- <a> -->
    }
    </script>
        <div>
            <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
            <div>
                <table border="1" style="background-color: red;">
                    <tr>
                        <td>A cell test!</td>
                        <td colspan="2" rowspan="2">
                            <table border="1" style="background-color: green;">
                                <tr>
                                    <td>Cell</td>
                                    <td colspan="2" rowspan="2"></td>
                                </tr>
                                <tr>
                                    <td>
                                        <input>
                                        <input>
                                        <input>
                                    </td>
                                </tr>
                                <tr>
                                    <td>Cell</td>
                                    <td>Cell</td>
                                    <td>Ce ll</td>
                                </tr>
                            </table>
                        </td>
                    </tr>
                    <tr>
                        <td>Test <span>Ce ll</span></td>
                    </tr>
                    <tr>
                        <td>Cell</td>
                        <td>Cell</td>
                        <td>Cell</td>
                    </tr>
                </table>
            </div>
        </div>
    </body>
</html>

डिंडेंट इंडेंटेशन जोड़ने से परे आपके कोड को स्वच्छ करने या अन्यथा हस्तक्षेप करने का प्रयास नहीं करेगा। यह आपके विकास / डिबगिंग को आसान बनाना है। उत्पादन के लिए नहीं।


Great question, because many developers, even experienced ones, are confused by the way PHP handles arrays in foreach loops. In the standard foreach loop, PHP makes a copy of the array that is used in the loop. The copy is discarded immediately after the loop finishes. This is transparent in the operation of a simple foreach loop. उदाहरण के लिए:

$set = array("apple", "banana", "coconut");
foreach ( $set AS $item ) {
    echo "{$item}\n";
}

This outputs:

apple
banana
coconut

So the copy is created but the developer doesn't notice, because the original array isn't referenced within the loop or after the loop finishes. However, when you attempt to modify the items in a loop, you find that they are unmodified when you finish:

$set = array("apple", "banana", "coconut");
foreach ( $set AS $item ) {
    $item = strrev ($item);
}

print_r($set);

This outputs:

Array
(
    [0] => apple
    [1] => banana
    [2] => coconut
)

Any changes from the original can't be notices, actually there are no changes from the original, even though you clearly assigned a value to $item. This is because you are operating on $item as it appears in the copy of $set being worked on. You can override this by grabbing $item by reference, like so:

$set = array("apple", "banana", "coconut");
foreach ( $set AS &$item ) {
    $item = strrev($item);
}
print_r($set);

This outputs:

Array
(
    [0] => elppa
    [1] => ananab
    [2] => tunococ
)

So it is evident and observable, when $item is operated on by-reference, the changes made to $item are made to the members of the original $set. Using $item by reference also prevents PHP from creating the array copy. To test this, first we'll show a quick script demonstrating the copy:

$set = array("apple", "banana", "coconut");
foreach ( $set AS $item ) {
    $set[] = ucfirst($item);
}
print_r($set);

This outputs:

Array
(
    [0] => apple
    [1] => banana
    [2] => coconut
    [3] => Apple
    [4] => Banana
    [5] => Coconut
)

As it is shown in the example, PHP copied $set and used it to loop over, but when $set was used inside the loop, PHP added the variables to the original array, not the copied array. Basically, PHP is only using the copied array for the execution of the loop and the assignment of $item. Because of this, the loop above only executes 3 times, and each time it appends another value to the end of the original $set, leaving the original $set with 6 elements, but never entering an infinite loop.

However, what if we had used $item by reference, as I mentioned before? A single character added to the above test:

$set = array("apple", "banana", "coconut");
foreach ( $set AS &$item ) {
    $set[] = ucfirst($item);
}
print_r($set);

Results in an infinite loop. Note this actually is an infinite loop, you'll have to either kill the script yourself or wait for your OS to run out of memory. I added the following line to my script so PHP would run out of memory very quickly, I suggest you do the same if you're going to be running these infinite loop tests:

ini_set("memory_limit","1M");

So in this previous example with the infinite loop, we see the reason why PHP was written to create a copy of the array to loop over. When a copy is created and used only by the structure of the loop construct itself, the array stays static throughout the execution of the loop, so you'll never run into issues.





php html indentation