सवाल PHP - अगर / अन्य, के लिए, foreach, जबकि - घुंघराले ब्रेसिज़ के बिना?


ऐसा कुछ जो वास्तव में जानना चाहता है लेकिन कभी नहीं मिला PHP में शॉर्टकट हैं।

मैं वर्तमान में एक समारोह के साथ एक कोड कोडिंग कर रहा हूँ foreach अंदर एक ही कथन के साथ लूप। मैंने घुंघराले ब्रेसिज़ को छोड़ने की कोशिश की क्योंकि आप नियंत्रण संरचनाओं में काम कर सकते हैं और यह काम करता है। त्रुटियाँ नहीं।

foreach($var as $value)
    $arr[] = $value;

अब मैंने इसे उसी तरह इस्तेमाल करने की कोशिश की लेकिन इसके अंदर एक if / else ब्लॉक डालने की कोशिश की। फिर, काम करना और कोई त्रुटि नहीं।

foreach($var as $value)
    if(1 + 1 == 2) {
        $arr[] = $value;
    };

फिर, मैंने सोचा कि "यह क्यों काम कर रहा है?" और समापन अर्धविराम छोड़ दिया। कर रही है। तो मैंने फ़ोरैच लूप के अंदर घुंघराले ब्रेसिज़ के बिना if / else कथन का उपयोग करने की कोशिश की और फिर भी, अभी भी काम कर रहा है और कोई त्रुटि नहीं है। लेकिन क्या फ़ोरैच लूप वास्तव में बंद / समाप्त हुआ है?

foreach($var as $value)
    if(1 + 1 == 2)
        $arr[] = $value;

कम से कम मैंने बंद अर्धविराम को फिर से छोड़ दिया और (जैसा कि अपेक्षित) एक पार्सिंग त्रुटि हुई।

तो मेरा बड़ा सवाल यह है कि: मैं घुंघराले ब्रेसिज़ को कब छोड़ सकता हूं और किस संरचना / लूप / फ़ंक्शन में? मुझे पता है कि मैं निश्चित रूप से ऐसा कर सकता हूं if तथा else। लेकिन क्या बारे में while, for तथा foreach?

और हाँ, मुझे पता है कि यह सुरक्षित, स्मार्ट नहीं है, घुंघराले ब्रेसिज़ के बिना कोड करने के लिए जो भी है और जैसे शॉर्टेंड हैं $condition ? true : false; तथा if: doSomething(); endif;, endfor; तथा endforeach;। मैं शॉर्टैंड्स के बारे में नहीं जानना चाहता हूं, मैं सिर्फ परिस्थितियों को समझना चाहता हूं कि घुंघराले ब्रैकेट को छोड़ना कब और कहाँ संभव है।


44
2018-01-04 11:45


मूल


वैसे, एक बंद ब्रेस के बाद अर्धविराम रखना आवश्यक नहीं है। इसका वाक्य रचनात्मक अर्थ उनके बीच एक खाली बयान जोड़ रहा है। घोषणाओं को छोड़कर, यह सभी सी-जैसी भाषाओं के बारे में सच है struct तथा class सी और सी ++ में। - Eric
धमकियों को छोड़ने के दौरान आपको समझने के लिए बयान और अभिव्यक्तियों के बीच अंतर सीखना होगा। और फिर अभिव्यक्ति संयोजन की एक मजबूत समझ अभी भी जरूरी है। - mario


जवाब:


जब आप ब्रेसिज़ को छोड़ देते हैं तो यह केवल अगले कथन का इलाज स्थिति के शरीर के रूप में करेगा।

if ($x) echo 'foo';

के समान है

if ($x) { echo 'foo'; }

लेकिन याद है कि

if ($x)
  echo 'foo';
  echo 'bar';

मर्जी हमेशा प्रिंट "बार"

आंतरिक रूप से यह दूसरी तरफ है: if केवल अगली अभिव्यक्ति को देखेंगे, लेकिन PHP सबकुछ में व्यवहार करता है {} एक एकल "समूहित" अभिव्यक्ति के रूप में।

अन्य नियंत्रण बयान के लिए वही (foreach, और इसी तरह)


75
2018-01-04 11:48



बहुत अच्छा और संक्षिप्त स्पष्टीकरण, धन्यवाद! :) क्या यह हर नियंत्रण संरचना पर काम कर रहा है? - headacheCoder
यह होना चाहिए। वर्तमान में पता नहीं है (और परीक्षण नहीं कर सकता) क्या है do{}while($X);, या 'स्विच'। - KingCrunch
@headacheCoder हाँ, यह काम करता है for, while, foreach तथा if। यह सी-जैसे वाक्यविन्यास वाली प्रत्येक भाषा के लिए भी ऐसा ही है। @ Tkone का जवाब नोट करें, हमेशा ब्रेसिज़ का उपयोग करने के लिए अच्छा अभ्यास कैसा है। - Eric
@headacheCoder: यह भी हर अभिव्यक्ति के साथ काम कर रहा है, देखें php.net/expressions । - hakre
एक अपवाद है; यह काम नहीं करता है अपवाद। पुण पूरी तरह से इरादा। - Francisco Presencia


ऐसे स्थान हैं जहां आप कर सकते हैं, लेकिन आपको कभी नहीं करना चाहिए।

स्पष्ट है हमेशा निहित से बेहतर।

कौन जानता है कि आपको वापस जाने और पुराने कोड को संशोधित करने के लिए कब जाना होगा। उस सामान को याद करना इतना आसान है और इसे करने से कुछ हासिल नहीं हुआ है।


25
2018-01-04 11:51





यदि आपके पास केवल एक तर्क है तो यह ठीक काम करेगा! लेकिन अगर आप घुंघराले ब्रेस को छोड़ना चाहते हैं तो आप कोलन और अंत का उपयोग कर सकते हैं। उदाहरण:

if(a < 1 ) :
    echo "a is less than 1";
else :
    echo "a is greater than 1";
endif;

10
2018-01-04 12:46





जैसा कि कहा है कि आप शॉर्टंड के बारे में नहीं जानना चाहते हैं और स्वीकृत उत्तर छोड़ने के बारे में अच्छा उदाहरण देता है curly braces, लेकिन जोड़ने के लिए कुछ है। जैसा कि आप देख सकते हैं कि इसे छोड़ना ठीक है curly braces के मामले में if ($x) echo 'foo';। कोड, कोई प्रदर्शन या अन्य मुद्दों के साथ कुछ भी गलत नहीं है और यह अन्य डेवलपर्स द्वारा पठनीय है। और उदाहरण आपको यह भी दिखाता है कि यदि आप लिखते हैं

if ($x)
    echo 'foo';
    echo 'bar';

के बजाय

if ($x)
    echo 'foo';

echo 'bar';

आप अवांछित परिणामों में भाग सकते हैं जहां bar मुद्रित किया जाता है जब आप इसे मुद्रित नहीं करना चाहते हैं और यदि आपका कोड ऐसे बयानों से भरा है तो यह आपके लिए अपना कोड पढ़ने और दूसरों को पढ़ने के लिए और भी कठिन बनाने के लिए कठिन बना देगा।

मैं शॉर्टेंड के बारे में नहीं जानना चाहता हूं, मैं केवल परिस्थितियों को समझना चाहता हूं कि घुंघराले ब्रैकेट को छोड़ना कब और कहाँ संभव है।

ये चीजें निकट से संबंधित हैं इसलिए यदि आप वास्तव में समझना चाहते हैं कि घुंघराले ब्रैकेट को छोड़ना संभव है तो यह एक जरूरी है जिसे आप समझते हैं या कम से कम शॉर्टेंड के बारे में जानते हैं, पढ़ चुके हैं

  1. PHP नियंत्रण संरचनाएं
  2. सामान्य रूप से PHP टर्नरी सशर्त ऑपरेटर और अभिव्यक्तियां

तो मेरा बड़ा सवाल यह है कि: मैं घुंघराले ब्रेसिज़ को कब छोड़ सकता हूं और किस संरचना / लूप / फ़ंक्शन में?

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

घुंघराले ब्रेस के साथ

if (PHP_VERSION_ID < 70000)
{
    print "PHP >= 7.0 required yours is ";
    print phpversion();
    print "\n";
    exit(1);
}

जैसा ही है 

if (PHP_VERSION_ID < 70000) :
    print "PHP >= 7.0 required yours is ";
    print phpversion();
    print "\n";
    exit(1);
endif;

या आप डॉट ऑपरेटर का उपयोग कर सकते हैं

if (PHP_VERSION_ID < 80000)
    (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n") . exit(1);

और आप टर्नरी सशर्त ऑपरेटर का उपयोग कर सकते हैं और यहां तक ​​कि छोड़ सकते हैं if घुंघराले ब्रेसिज़ छोड़ने के अलावा यह स्वयं

(PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n") . exit(1);

चूंकि हम केवल प्रिंट करते हैं, हम इसे छोटा कर सकते हैं और कुछ को पट्टी कर सकते हैं print string functions जो घुंघराले ब्रेसिज़ के बिना कथन में एक से अधिक फ़ंक्शन का प्रतिनिधित्व करने के लिए यहां थे

(PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is " . phpversion() . "\n") . exit(1);

PHP 7 के रूप में हम नल कोलेसिंग ऑपरेटर का उपयोग कर सकते हैं

(PHP_VERSION_ID > 70000) ?: null ?? (print "PHP >= 7.0 required yours is ".phpversion() . "\n") . exit(1);

जैसा कि कोई देख सकता है कि आप वही परिणाम प्राप्त कर सकते हैं। यह न केवल इसके लिए लागू होता है if उदाहरण के साथ अभ्यास किया जा सकता है structure/loop/function। तो आपके लिए कोई जवाब नहीं है बड़ा सवाल। मुख्य रूप से निम्नलिखित पर विचार करना चाहिए।

  1. क्या कोड आप लिखने के लिए आसान लिख रहे हैं।
  2. क्या आप अपने स्वयं के लिए जवाब दे सकते हैं कि आप घुंघराले ब्रेसिज़ को छोड़कर जीतते हैं।

5
2018-01-25 20:04



हम्म, मुझे नहीं पता था कि उन्होंने एल्विस ऑपरेटर को एक नल कोलेसिंग ऑपरेटर जोड़ा ... साफ। लेकिन ऑपरेटर का कौन सा पक्ष शून्य है, और क्या यह सशर्त ब्लॉक में अनसेट चर को अनुमति देता है? - Ber
$I_want_value = $if_im_not_null_use_me ?? $if_first_is_null_use_me ?? $if_second_is_null_use_me; तो आपके पास उतने विकल्प हो सकते हैं जितना कि यदि पिछला चर नल है; PHP 7 नई विशेषताएं - M.Kungla
दिलचस्प है, तो यह एक infininary ऑपरेटर है ... लेकिन यह अपरिभाषित चर पर काम करता है? मैं डॉक्टर की जांच करूंगा। मुझे लगता है कि एक नल कोलेसिंग ऑपरेटर होने का एकमात्र उद्देश्य है, अन्यथा क्यों न केवल एल्विस का उपयोग करें। ? :) - Ber
आह इतना, ?? डॉक्स कहते हैं, अनसेट वैरिएबल पर काम करता है। आश्चर्यजनक! यह PHP में जारी () कॉल के बड़े पैमाने पर क्रॉफ्ट को कम कर सकता है। - Ber


मैं अपने PHP टेम्पलेट्स में घुंघराले ब्रेसिज़ छोड़ देता हूं। जैसे आप निम्नानुसार लूप का उपयोग कर सकते हैं:

<ul>
    <?php foreach ($var as $value): ?>
        <li><?php echo $value; ?></li>
    <?php endforeach; ?>
</ul>

3
2018-01-04 11:51



वैकल्पिक वाक्यविन्यास कुछ अलग है। - KingCrunch
ओपी ने यह भी कहा कि वह वैकल्पिक वाक्यविन्यास के बारे में जानता था और सवाल यह नहीं था कि सवाल क्या था। - CommandZ


आप इसे सरल चीजों के लिए उपयोग कर सकते हैं जैसे:

if($a === true) continue;

लेकिन कुछ और जटिल उप-स्थितियों के लिए यह आपको समस्याएं पैदा कर सकता है:

    $a = false;
    $b = false;
    if ($a === true)
        if ($b === true)
            echo 1;
    else
        echo 2;

उपरोक्त कोड के साथ, आप आउटपुट के रूप में "2" को देखने की उम्मीद करेंगे, लेकिन आप नहीं करेंगे।


2
2018-05-21 08:03





सिंगल लाइन स्टेटमेंट्स के लिए।

अगर आप करने की कोशिश की

foreach($array as $x => $y)
    $do_something = $x;
    $do_something_else = $y;

जब तक मैं गलत नहीं हूं, php दुभाषिया फोरच स्टेटमेंट के तहत दूसरी पंक्ति को अंतर्निहित ब्रेसिज़ के बाहर होने के रूप में ले जाएगा

इंडेंटेशन के कारण यदि आप बाद में इस कोड पर वापस आए, या किसी अन्य डेवलपर ने आपके काम को देखा तो यह भ्रमित हो जाएगा।

जैसे कि इन बयानों के साथ हमेशा ब्रेसिज़ का उपयोग करना हमेशा बुद्धिमान होता है। यह बाद में सिरदर्द / भ्रम बचाएगा


1
2018-01-04 11:49



आप सही हे। दूसरी पंक्ति लूप के अंदर नहीं है। केवल अगली अभिव्यक्ति है। - CommandZ


पूरक करने के लिए @Markoजवाब, जागरूक रहें कि इस मामले के लिए डॉट ऑपरेटर का उपयोग करते समय, आपको प्रत्येक ऑपरेशन को कोष्ठक में संलग्न करना चाहिए, अन्यथा यह आदेश को उलट देगा।

उदाहरण के लिए, नीचे दिया गया यह कोड प्रिंट करेगा PHP >= 7.0 required yours is 5.6.15

(print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n");

हालांकि यह प्रिंट करेगा 5.6.151PHP >= 7.0 required yours is 1

print("PHP >= 7.0 required yours is ") . print(phpversion()) . print("\n");

आप भी इसका उपयोग कर सकते हैं and काम करने के लिए ऑपरेटर। इस तरह:

if (PHP_VERSION_ID < 70000)
    print("PHP >= 7.0 required yours is ") and
    print(phpversion()) and
    print("\n");

1
2017-07-31 18:02





यह तब संभव है जब आपके क्लॉज के बाद आपके पास केवल एक अभिव्यक्ति हो

उदाहरण के लिए,

foreach($var as $value)
    if(1 + 1 == 2) {
        $arr[] = $value;
    };

सही है, लेकिन

foreach($var as $value)
    $somevar = $var;
    if(1 + 1 == 2) {
        $arr[] = $value;
    };

नहीं है, और PHP दुभाषिया ऐसा सोचेंगे if बयान बाहर है foreach


0
2018-01-04 11:48





जवाब आसान है। यह सी / सी ++ में समान है।

यदि, यदि / else, अगर / else अगर / else और loops => यदि अगला कथन एक पंक्ति है, तो आप घुंघराले ब्रेसिज़ को छोड़ सकते हैं।

उदाहरण के लिए:

for($i= 0; $i<=100; $i++)
{
    if($i % 7 == 0)
    {   
        echo $i . "<br>";
    }

}

इसे इस तरह से भी लिखा जा सकता है:

for($i= 0; $i<=100; $i++) if($i % 7 == 0) echo $i . "<br>";

0
2018-04-21 10:46





मैं घुंघराले ब्रेसिज़ को कब छोड़ सकता हूं और किस संरचना / लूप / फ़ंक्शन में?   मुझे पता है कि मैं निश्चित रूप से ऐसा कर सकता हूं यदि और अन्यथा। लेकिन क्या बारे में   जबकि, के लिए और foreach?

के लिये यदि नहीं तो यह संभव है एक तथा एकाधिक बयान निम्नलिखित निर्माण का उपयोग करके घुंघराले ब्रेसिज़ के बिना:

<?php
  if ($x):
    echo 'foo';
    echo 'bar';
  else:
    echo 'nofoo';
    echo 'nobar';
  endif;
?>

जैसा कि वर्णन किया गया है यह जवाब

के लिये जबकि, के लिये तथा प्रत्येक के लिए, केवल एकल बयान घुंघराले ब्रैकेट के बिना अनुमति दी जाती है

<?php
foreach($array as $x => $y)
    $do_something = $x;
?>

0
2017-08-08 10:39