केवल दो तर्कों के साथ PHP के टर्नरी ऑपरेटर का उपयोग करना


9

मैं हाल ही में अपने कुछ कोड की समीक्षा कर रहा था और ध्यान दिया कि अनुपस्थित मन की स्थिति में, मैंने निम्नलिखित की तरह एक संरचना छोड़ दी:

$guid = empty($subscription->guid) ?  : $subscription->guid;

अब, यह वह नहीं कर रहा था जो इसे माना जाता है और गलत है , लेकिन चूंकि यह संपत्ति हमेशा सेट है अब यह ठीक काम कर रहा था, और निम्न परिवर्तन के कारण 5.3 के बाद कोई सिंटैक्स त्रुटि नहीं है :

PHP 5.3 के बाद से, टर्नरी ऑपरेटर के मध्य भाग को छोड़ना संभव है। Expr1 ?: expr3 रिटर्न expr1 अगर expr1 TRUE का मूल्यांकन करता है, और expr3 अन्यथा।

मुझे इस परिवर्तन के बारे में पता नहीं था, और अब मैं उत्सुक हूं कि मुझे इसका उपयोग करना चाहिए या नहीं। यह एक ऐसी चीज है जिसे मैं रूबी जैसी भाषाओं से गायब कर रहा था जहाँ आप 'असली' बूलियन के बजाय या a = b || cतो प्राप्त कर सकते हैं । हालाँकि, टर्नरी ऑपरेटर के लिए उन्होंने जो वाक्य-विन्यास चुना है, वह मेरे लिए थोड़ा सहज है। क्या मुझे उत्पादन कोड में इसका उपयोग करना चाहिए? यह निश्चित रूप से खुद को फेंक दिया जब मैंने इसे दुर्घटना से देखा।bc


आप अशक्त कि Varsolp के लिए ऑपरेटर वालों का उपयोग करना चाहिए techflirt.com/null-coalescing-operator-php
अंकुर कुमार सिंह

जवाबों:


7

दूसरे तर्क के बिना टर्नरी सशर्त ऑपरेटर एक सा उपन्यास है, लेकिन यह सी # और पर्ल जैसी अन्य अल्गोल-व्युत्पन्न भाषाओं में पाए जाने वाले अशक्त-सहवर्ती ऑपरेटर के समान 1 है , और जैसा कि आप उल्लेख करते हैं, रूबी (और जावास्क्रिप्ट) में ऑपरेटर।||

यह पहली बार में अजीब लग रहा है, लेकिन यह भी बाहर नहीं है (विशेषकर चूंकि अन्य भाषाओं में इसी तरह के ऑपरेटरों के लिए मिसाल है), और कीस्ट्रोक्स का एक अच्छा सौदा बचा सकता है। और, अगर नामस्थान परिसीमन ( \) किसी भी संकेत के साथ हुआ है, तो अजीब सिंटैक्स अंततः PHP समुदाय द्वारा अपनाया जाएगा।

लेकिन PHP की बड़ी समस्याओं में से एक का सामना करना पड़ता है (कभी-कभी) PHP के एक नए संस्करण की रिहाई के बीच (कभी-कभी) लंबा अंतराल समय होता है और जब मेजबान इसका समर्थन करना शुरू करते हैं। यह उन मुद्दों की ओर जाता है जहां आपको PHP के पुराने संस्करणों के साथ पीछे की ओर संगत होना चाहिए, इस तरह की सुविधा परिवर्तनों का उपयोग करने से पहले।

यदि यह आपके लिए चिंता का विषय नहीं है, और आपकी टीम इसके उपयोग पर सहमत है (या यदि आप एक एकल डेवलपर हैं, यदि आप इसके साथ सहज हैं), तो हर तरह से इसके लिए जाएं। नामस्थान परिसीमन की तरह, मुझे वास्तव में लगता है कि यह वास्तव में कब की बात होगी, यदि नहीं, तो यह भविष्य की सभी PHP परियोजनाओं में स्वीकार्य होगा।


नोट 1 : लेकिन समान नहीं, दिए गए अशक्त-संचालक केवल गैर-शून्य मानों (और PHP जैसे सत्य मानों) पर परीक्षण करते हैं, और ?:जैसा कि आपने टिप्पणियों में उल्लेख किया है, वाक्यविन्यास अपरिभाषित नोटिस को दबाता नहीं है ।


फिलहाल, मेरी 'टीम' में विशुद्ध रूप से मैं शामिल हूं। होस्टिंग कोई समस्या नहीं है क्योंकि हम आमतौर पर हमारे द्वारा बनाई गई साइटों के 98% की मेजबानी करते हैं, और हम 5.3.6 के शीर्ष पर होस्ट करते हैं। मुझे लगता है कि कार्यक्षमता ही असामान्य नहीं है, बस इसके लिए वाक्यविन्यास जो मेरे सवाल का मूल था। वहाँ भी मुद्दा है जहाँ यह अधिक वाक्यविन्यास के बिना एक अशक्त- coalescing ऑपरेटर की तरह काम नहीं करता है ( @अपरिभाषित चीजों के बारे में नोटिस छिपाने के लिए)।
मैथ्यू शेर्ले

3
@MatthewScharley यदि नाम स्थान का सीमांकक (\) पराजय कोई संकेत है, तो अजीब सिंटैक्स PHP में व्यापक रूप से अपनाने के लिए एक बाधा नहीं है। यह वास्तव में कब, यदि नहीं, तो आपको इसका उपयोग शुरू करना चाहिए।

3

मेरे लिए, वह कोड में एक त्रुटि की तरह दिखता है। यह गलत दिखता है, और सामान्य तौर पर, मैं वाक्यविन्यास का उपयोग करने से बचता हूं जो ऐसा लगता है कि आपने कुछ कीस्ट्रोक्स को बचाने के लिए एक त्रुटि की है। जब आप (या कोई और) बाद में कोड को पढ़ने के लिए वापस जाते हैं, तो मुझे लगता है कि लाइन आपको यात्रा करने जा रही है और इसके कारण आपको समय बिताना होगा कि यह क्या कर रहा है, जो अनिवार्य रूप से एक सरल ऑपरेशन है।


दिया गया उदाहरण गलत है । इरादा के रूप में कार्यक्षमता का सही उपयोग किया जाएगा $foo = @$bar ?: 'baz'जो के बराबर है $foo = (@$bar ? $bar : 'baz')। मैं हालांकि आपकी टिप्पणियों से सहमत हूं।
मैथ्यू शार्ले

1

खैर, पीएचपी एक बूलियन प्रकार है और ||ऑपरेटर PHP में परिणाम एक boolen देता है, इसलिए की $a || $bएक बूलियन है, इस के साथ संगत है &&के साथ के रूप में &&एक या दूसरे वापस जाने के लिए यह थोड़ा समझ में आता है लेकिन वापसी के लिए समझ में आता है true/ false। सभी बूलियन ऑपरेटरों के वापस आने से बूल काफी तार्किक लगता है।

इसके अतिरिक्त यह PHP से कोई आविष्कार नहीं है, लेकिन C का अनुसरण कर रहा है, जहाँ "क्लासिक" PHP के कई डिज़ाइन तत्व आ रहे हैं। C99 मानक के .56.5.14 से उद्धरण:

|| ऑपरेटर 1 का उत्पादन करेगा यदि उसके किसी भी ऑपरेंड ने असमान की तुलना 0 से की है; अन्यथा, इसकी पैदावार 0. परिणाम का प्रकार int है।

और, ठीक है, आप का उपयोग करना चाहिए घरघराहट ?: या नहीं सामान्य रूप में जवाब नहीं दिया जा सकता है, लेकिन मन: भाषा का सबसे अच्छा तरीका यह है कि यह जो भी प्रतिमान सुझाता है उसका उपयोग करता है और इसका उपयोग करता है। जावा कोड को C कोड, या अन्य तरीके से लिखने में बहुत कम समझ आती है ;-)


0

मुझे लगता है कि यह एक बहुत ही उपयोगी ऑपरेटर है और निश्चित रूप से इसका उपयोग किया जाना चाहिए क्योंकि भाषा मानक इसे स्पष्ट रूप से परिभाषित करता है।

ध्यान दें कि इसे आधिकारिक तौर पर ग्रोय में एल्विस ऑपरेटर कहा जाता है (क्यों? बस इसे करीब से देखें!), और जावा 7 में पेश करने का प्रस्ताव दिया गया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.