मिसिंग {या }गलत इंडेंटेशन के कारण
बेमेल कोड ब्रेस कम से कम अच्छी तरह से स्वरूपित कोड के लिए आम हैं:
if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){
यदि आपका कोड ऐसा दिखता है, तो नए सिरे से शुरुआत करें! अन्यथा यह आपके या किसी और के लिए अपरिहार्य है। मदद के लिए पूछताछ करने के लिए इंटरनेट पर इसे दिखाने का कोई मतलब नहीं है।
आप केवल इसे ठीक करने में सक्षम होंगे, यदि आप नेत्रहीन संरचना का अनुसरण कर सकते हैं और यदि / और सशर्त और उनके {कोड ब्लॉक के संबंध हैं }। अपने IDE का उपयोग करके देखें कि क्या वे सभी जोड़े हैं।
if (true) {
if (false) {
…
}
elseif ($whatever) {
if ($something2) {
…
}
else {
…
}
}
else {
…
}
if (false) { // a second `if` tree
…
}
else {
…
}
}
elseif (false) {
…
}
कोई भी डबल } }बस एक शाखा को बंद नहीं करेगा, लेकिन एक पिछली स्थिति संरचना। इसलिए एक कोडिंग शैली के साथ छड़ी; मिक्स एंड मैच न हो तो नेस्टेड में / वरना पेड़।
यहां स्थिरता के अलावा, यह लंबी परिस्थितियों से भी बचने में मददगार है। अपठनीय if-expressions से बचने के लिए अस्थायी चर या कार्यों का उपयोग करें ।
IF अभिव्यक्ति में इस्तेमाल नहीं किया जा सकता है
एक आश्चर्यजनक रूप से लगातार नवागंतुक गलती ifअभिव्यक्ति में एक बयान का उपयोग करने की कोशिश कर रही है , जैसे कि एक प्रिंट स्टेटमेंट:
⇓
echo "<a href='" . if ($link == "example.org") { echo …
जो निश्चित रूप से अमान्य है।
आप एक टर्नरी स्थिति का उपयोग कर सकते हैं , लेकिन पठनीयता प्रभावों से सावधान रहें।
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
अन्यथा इस तरह के आउटपुट का निर्माण टूट जाता है: कई ifएस और echoएस का उपयोग करें ।
बेहतर अभी तक, अस्थायी चर का उपयोग करें , और अपनी शर्तों को पहले रखें:
if ($link) { $href = "yes"; } else { $href = "no"; }
echo "<a href='$href'>Link</a>";
ऐसे मामलों के लिए फ़ंक्शंस या तरीकों को परिभाषित करना भी अक्सर समझ में आता है।
नियंत्रण ब्लॉक "परिणाम" वापस नहीं करते हैं
अब यह कम आम है, लेकिन कुछ कोडर्स भी इलाज करने की कोशिश करते हैं ifजैसे कि यह एक परिणाम दे सकता है :
$var = if ($x == $y) { "true" };
जो संरचित रूप से ifएक स्ट्रिंग संयोजन / अभिव्यक्ति के भीतर उपयोग करने के लिए समान है ।
- लेकिन नियंत्रण संरचनाओं (यदि / foreach / जबकि) के पास "परिणाम" नहीं है ।
- शाब्दिक स्ट्रिंग "सच" भी केवल एक शून्य कथन होगा।
आपको कोड ब्लॉक में असाइनमेंट का उपयोग करना होगा :
if ($x == $y) { $var = "true"; }
वैकल्पिक रूप से, एक ?:टर्नरी तुलना का सहारा लें ।
अगर में अगर
आप किसी शर्त के भीतर घोंसला नहीं बना सकतेif :
⇓
if ($x == true and (if $y != false)) { ... }
जो स्पष्ट रूप से निरर्थक है, क्योंकि and(या or) पहले से ही तुलना की अनुमति देता है।
भुला दिया ;अर्धविराम
एक बार और अधिक: प्रत्येक नियंत्रण ब्लॉक को एक बयान होना चाहिए। यदि पिछला कोड टुकड़ा अर्धविराम द्वारा समाप्त नहीं किया गया है, तो यह एक गारंटीकृत वाक्यविन्यास त्रुटि है:
⇓
$var = 1 + 2 + 3
if (true) { … }
Btw, एक {…}कोड ब्लॉक में अंतिम पंक्ति को एक अर्धविराम भी चाहिए।
अर्धविराम बहुत जल्दी
अब किसी विशेष कोडिंग शैली को दोष देना शायद गलत है, क्योंकि इस नुकसान की अनदेखी करना बहुत आसान है:
⇓
if ($x == 5);
{
$y = 7;
}
else ←
{
$x = -1;
}
जो कि आपकी कल्पना से अधिक बार होता है।
- जब आप इसके साथ अभिव्यक्ति समाप्त करते हैं तो
if (); यह एक शून्य कथन निष्पादित करेगा। ;एक एक खाली हो जाता है {}अपनी खुद की!
{…}ब्लॉक इस प्रकार से अलग है if, और हमेशा भाग जाता है।
- तो
elseअब एक खुले ifनिर्माण से कोई संबंध नहीं था , यही कारण है कि यह एक अप्रत्याशित T_ELSE सिंटैक्स त्रुटि को जन्म देगा।
जो इस सिंटैक्स त्रुटि के समान सूक्ष्म बदलाव की व्याख्या करता है:
if ($x) { x_is_true(); }; else { something_else(); };
जहां ;कोड ब्लॉक के बाद {…}पूरे if
निर्माण को समाप्त कर दिया जाता है, elseशाखा को कृत्रिम रूप से अलग कर दिया जाता है।
कोड ब्लॉक का उपयोग नहीं करना
यह वाक्य रचना घुंघराले ब्रेसिज़ छोड़ करने की अनुमति दी है {... }कोड ब्लॉक के लिए में if/ elseif/else शाखाओं। दुख की बात है कि एक वाक्यविन्यास शैली बहुत सामान्य कोडर के लिए सामान्य है। (झूठी धारणा के तहत यह टाइप या पढ़ने के लिए तेज था)।
हालाँकि, सिंटैक्स तक यात्रा करने की अत्यधिक संभावना है। जल्द ही या बाद में अतिरिक्त बयान अगर / अन्य शाखाओं में अपना रास्ता खोज लेंगे:
if (true)
$x = 5;
elseif (false)
$x = 6;
$y = 7; ←
else
$z = 0;
लेकिन असल में कोड ब्लॉक का उपयोग करने के लिए, आप की क्या ज़रूरत है लिखने के लिए {... }इस तरह के रूप में उन्हें!
यहां तक कि अनुभवी प्रोग्रामर इस बहादुरी के सिंटैक्स से बचते हैं, या कम से कम इसे नियम के असाधारण अपवाद के रूप में समझते हैं।
गलत क्रम में एल्से / एल्सीफ
अपने आप को याद दिलाने के लिए एक चीज सशर्त आदेश है , निश्चित रूप से।
if ($a) { … }
else { … }
elseif ($b) { … }
↑
आप जितने चाहें उतने elseifएस कर सकते हैं, लेकिन elseअंतिम बार जाना होगा । बस, यह कैसा है।
वर्ग घोषणाएँ
जैसा कि ऊपर उल्लेख किया गया है , आपके पास एक वर्ग घोषणा में नियंत्रण कथन नहीं हो सकता है:
class xyz {
if (true) {
function ($var) {}
}
आप या तो फ़ंक्शन की परिभाषा भूल गए , या }ऐसे मामलों में बहुत जल्दी बंद हो गए।
अनपेक्षित T_ELSEIF / T_ELSE
जब PHP और एचटीएमएल मिश्रण, समापन }एक के लिए if/elseifएक ही पीएचपी ब्लॉक में होना चाहिए <?php ?>अगले के रूप में elseif/else। इस समापन के रूप में एक त्रुटि उत्पन्न होगा }के लिए ifकी जरूरत का हिस्सा बनने का elseif:
<?php if ($x) { ?>
html
<?php } ?>
<?php elseif ($y) { ?>
html
<?php } ?>
सही रूप <?php } elseif:
<?php if ($x) { ?>
html
<?php } elseif ($y) { ?>
html
<?php } ?>
यह गलत इंडेंटेशन की अधिक या कम भिन्नता है - संभवतः अक्सर गलत कोडिंग इरादों के आधार पर।
आप अन्य कथनों को इनबेट्विन if और elseif/ elseस्ट्रक्चरल टोकन को मैश नहीं कर सकते :
if (true) {
}
echo "in between"; ←
elseif (false) {
}
?> text <?php ←
else {
}
या तो केवल {…}कोड ब्लॉक में हो सकता है , नियंत्रण संरचना टोकन के बीच में नहीं।
- यह वैसे भी समझ में नहीं आएगा। यह ऐसा नहीं है कि जब PHP
ifऔर elseशाखाओं के बीच कूदता है तो कुछ "अपरिभाषित" स्थिति थी ।
- आपको अपना मन बनाना होगा जहां प्रिंट स्टेटमेंट / या दोनों शाखाओं में दोहराया जाना चाहिए।
और न ही आप अलग-अलग नियंत्रण संरचनाओं के बीच एक / अन्य भाग कर सकते हैं :
foreach ($array as $i) {
if ($i) { … }
}
else { … }
कोई है वाक्यात्मक संबंध के बीच ifऔर else। foreachपर शाब्दिक गुंजाइश समाप्त हो जाती है }, इसलिए वहाँ के लिए कोई मतलब नहीं है ifजारी रखने के लिए संरचना।
T_ENDIF
एक अप्रत्याशित T_ENDIF बारे में शिकायत की है, तो आप विकल्प वाक्य रचना शैली का उपयोग कर रहे if:⋯ elseif:⋯ else:⋯ endif;। जिसके बारे में आपको दो बार सोचना चाहिए।
एक आम नुकसान अर्धविराम के लिए एक समान :बृहदान्त्र; को भ्रमित कर रहा है । ("अर्धविराम बहुत जल्दी" में शामिल)
जैसा कि इंडेंटेशन टेम्प्लेट फ़ाइलों में ट्रैक करना कठिन है, वैकल्पिक सिंटैक्स का उपयोग करते समय अधिक - यह प्रशंसनीय है कि आपका endif;कोई मेल नहीं खाता है if:।
का उपयोग करते हुए } endif;
एक दोगुना है if -minminator।
जबकि एक "अप्रत्याशित $ अंत" आम तौर पर एक भूल बंद }करी घुंघराले के लिए कीमत है ।
तुलना बनाम तुलना
तो, यह एक सिंटैक्स त्रुटि नहीं है, लेकिन इस संदर्भ में ध्यान देने योग्य है:
⇓
if ($x = true) { }
else { do_false(); }
यह एक ==/ ===तुलना= नहीं है , लेकिन एक असाइनमेंट है । यह बल्कि सूक्ष्म है, और आसानी से कुछ उपयोगकर्ताओं को असहाय रूप से संपूर्ण स्थिति ब्लॉकों को संपादित करने का नेतृत्व करेगा। अनजाने असाइनमेंट के लिए पहले देखें - जब भी आपको लॉजिक फॉल्ट / मिसबिहेव का अनुभव हो।