2011-07-06 13 views
10

मैं एक WordPress टेम्पलेट को संशोधित कर रहा हूं और मैं उत्सुक हूं कि यह PHP में मान्य नियंत्रण संरचना कैसे है। किसी के पास कोई अंतर्दृष्टि है?यह वैध PHP कोड कैसा है?

<?php if(condition): ?> 
<?php if(!condition || !function()) ?> 
<?php elseif(condition): ?> 
<?php if(!condition || !function()) ?> 
<?php endif; ?> 

अगर मैं सभी टैग निकालने के लिए, मैं (अधिक समझदार खरोज के साथ) मिलती है:

<?php 
if(condition): 
    if(!condition || !function()) 
elseif(condition): 
    if(!condition || !function()) 
endif; 
?> 

जो अमान्य है क्योंकि दांतेदार if बयान न करना पड़े। तो अगर यह कोड हर जगह PHP टैग खोलने और बंद कर रहा है तो यह कोड मान्य क्यों है?


केरेक एसबी के लिए संपादित करें। एक php फ़ाइल बनाओ और इसे चलाएं। यह वैध है: क्योंकि पीएचपी ?> के बाद एक भी नई पंक्ति को हटा अगर मौजूद

<?php if(true): ?> 
<?php if(true) ?> 
<?php endif; ?> 
<?php echo 'here'; ?> 
+3

मैं विवाद करता हूं कि यह मान्य है। क्या आपने इसे सफलतापूर्वक चलाया है? सभी पर त्रुटियां? –

+0

@ केरेक एसबी - हाँ, मैंने इसका परीक्षण किया। यह मान्य है, मुझे कोई सुराग क्यों नहीं है। –

+0

@cwolves: मैंने भी किया, और मुझे 'पार्स त्रुटि मिली: वाक्यविन्यास त्रुटि, अप्रत्याशित T_ELSEIF' ... मुझे अपने नए उदाहरण का परीक्षण करने दें। इसके अलावा, क्या आप इसे वास्तविक कोड बना सकते हैं, कृपया स्यूडोकोड नहीं? –

उत्तर

4

आपका (कम) उदाहरण के कोड इस के बराबर है:

<?php 
if(condition): 
    if(!condition || !function()) { } 
endif; 
?> 

या भी:

<?php 
if(condition): 
    if(!condition || !function()); 
endif; 
?> 

<?php टैग बंद बंद करने से, आप एक "खाली बयान प्राप्त करने के लिए दिखाई देते हैं " मुक्त करने के लिए।

आपका वास्तविक उदाहरण इसलिए की तरह एक लाइन किया जा सकता है:

<?php if(true): if(true); endif; echo 'here'; ?> 

लेकिन ध्यान दें कि एक elseif इस ambigous बनाता है!

<?php 
if(condition): 
    if(!condition || !function()); 
elseif(condition): // Bogus! which block does this belong to? 
    if(!condition || !function()); 
endif; 
?> 

हम इस को स्पष्ट करना होगा:

<?php 
if(condition): 
{ 
    if(!condition || !function()); 
} 
elseif(condition): 
{ 
    if(!condition || !function()); 
} 
endif; 
?> 

अब यह स्पष्ट है, लेकिन अब हम अपने आप को पूरी तरह पेट के वाक्य रचना बख्शा जा सकता था।

इसे इंगित करने के लिए लेकेनस्टीन के लिए धन्यवाद!

आगे की विषमताओं के लिए नीचे चर्चा देखें।

+0

नहीं पूरी तरह से सच फेंक नहीं है, इस मामले ले: ' '(वाक्यविन्यास त्रुटि) बनाम' XXX '(' XXX' नोट करें)। मुझे यकीन नहीं है कि यह एक बग या फीचर है। – Lekensteyn

+0

इसे समझने के लिए धन्यवाद। अपने एज-केस का दुरुपयोग करने के बारे में बात करें :) –

+2

@Lekensteyn - ARGH! –

2

आपका कोड काम नहीं करेगा। ?>[newline]<?php रूप ?><?php

(functionfunction के बाद से fn द्वारा प्रतिस्थापित एक कीवर्ड है;) कुछ नीचे होगा अधिक भावना की तरह ही होगा):

:

<?php if(condition): ?> 
<?php if(!condition || !fn()) ?> 
some 
<?php elseif(condition): ?> 
<?php if(!condition || !fn()) ?> 
thing 
<?php endif; ?> 

यह के रूप में व्याख्या होगी

<?php 
if(condition): 
    if(!condition || !fn()) echo "some"; 
elseif(condition): 
    if(!condition || !fn()) echo "thing"; 
endif; 
?> 

ध्यान दें कि दो ifs पर : नहीं है, उनको if जैसा माना जाएगा जो इसके आगे एक शरीर की अपेक्षा करते हैं। एक अन्य तरीके से लिखा:

<?php 
if (condition) { 
    if (!condition || !fn()) { 
     echo "some"; 
    } 
} else if (condition) { 
    if (!condition || !fn()) { 
     echo "thing"; 
    } 
} 
?> 
+0

है कि यह काम :) –

+0

"समारोह" करता है को छोड़कर Dooh, मैं इसे भर में है, जबकि जवाब :) – Lekensteyn

+0

आह, हाँ खेद में सुधार आया है। मैं सिर्फ एक सामान्य समारोह :) –

-1

चेक बाहर PHP.net के explaination

+1

मतलब मैं क्या 'यदि:' करता है, मेरे सवाल क्यों नेस्ट है अगर बयान त्रुटियों –

0

आप प्रयोग नहीं कर रहे हैं, तो आप के साथ पालन करने की आवश्यकता: तर्क के लिए के बाद यदि नेस्ट (रों)।

<?php 
    function foobar() { 
      return true; 
    } 
    function bar() { 
      return false; 
    } 

    $foobar = true; 
    $bar = false; 

    if($foobar): 
     if(!$bar || !foobar()): 
      echo 'foobar'; 
     endif; 
    elseif($bar):  
     if(!$foobar || !bar()): 
      echo 'bar'; 
     endif; 
    endif; 
0

"जो अमान्य है क्योंकि दांतेदार बयान समाप्त नहीं करता है, तो"

हाँ वे करते हैं। जैसा कि php.net पर बताया गया है, दोनों नोटेशन का मिश्रण समर्थित नहीं है, जिसका अर्थ है कि आपके पास if():, elseif(): और endif; के भीतर एक नया कोड-ब्लॉक (दो if() डबल पॉइंट के बिना) है।

if(condition): 
    if(!condition || !function()) 
     // do nothing here, end of first inner if 
elseif(condition): 
    if(!condition || !function()) 
     // also do nothing here, end of second inner if 
endif; // end of outer if/else 
0

which is invalid because the indented if statements don't end

वास्तव में, वे करते हैं। ?> किसी अन्य की तरह बयान समाप्त हो जाता है, तो:

<?php 
if(condition): 
    if(!condition || !function()); 
elseif(condition): 
    if(!condition || !function()); 
endif; 
?> 

यह स्थिति नहीं थे, उसके बाद निम्न भी एक सिंटैक्स त्रुटि होगा:

Lol <?php echo "cakes" ?> extravaganza <?php echo "innit" ?> 
0

क्या मैं देख रहा हूँ कि आप मिश्रण कर रहे हैं php में 'if' निर्माण के निर्माण के दो संभावित रूप।

if (condition) instruction; 

if (condition) { more; than; one; instructions; } 

दूसरा एक है:

प्रथम रूप में या तो है

if (condition): instruction; another; endif; 

जब आप

<?php if (condition) ?> 

... लिखने के बिना एक '{' या ' : 'समापन से पहले'?> टैग, वास्तव में आप निर्देशों को छोड़कर if आदेश को छोटा कर रहे हैं, और PHP इसे स्वीकार करते हैं। जब आप फिर से php टैग खोलेंगे, तो आप पहले से ही बाहर हैं।

वही लागू नहीं होता है यदि आप केवल एक ही ब्लॉक में निर्देश को "भूल जाते हैं", जहां 'endif;' एक निर्देश के रूप में अनुमति नहीं है;

तो:

<?php if (condition) ?> 
anything outside the if 
<?php instruction_outside_the_if; ?> 

... व्यर्थ है (क्योंकि आप अगर एक विस्तृत लेकिन इसके बाद कुछ भी नहीं है), लेकिन एक सख्त त्रुटि नहीं है।

<?php if (condition 1): ?> <!-- note the ':' in this if --> 
<?php if (condition 2) ?> 
anything outside the second if but inside the first 
<?php endif; ?> <!-- this closes the first if 

... यहां आपके पास पहला काम है, लेकिन दूसरा अभी भी खाली है।

<?php if (condition 1): ?> <!-- note the ':' in this if --> 
<?php if (condition 2) ?> 
anything outside the second if but inside the first 
<?php else: ?> 
still outside the second if but inside the first, in the ELSE part 
<?php endif; ?> <!-- this closes the first if 

... यह आपके उदाहरण की तरह कम या कम है, जहां अन्य (या elseif) पहले से संबंधित है।


<?php if (true) ?> 
<?php elseif(foo){ }; ?> 

एक और अपवाद है कि, आप एक बंद टैग और खुलने वाला टैग, इसलिए पार्सर के बीच कुछ भी डाल नहीं कर रहे हैं के रूप में "का अनुकूलन" उन्हें बाहर (वास्तव में उस तरह नहीं है, लेकिन यह एक सही सन्निकटन है) । दो PHP टैग्स के बीच कुछ भी डालने का प्रयास करें, जैसे:

<?php if (true) ?> 
anything 
<?php elseif(foo){ }; ?> 

...और "वाक्यविन्यास त्रुटि, अप्रत्याशित T_ELSEIF" दिखाई दें।

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