?: PHP में ऑपरेटर ('एल्विस ऑपरेटर')


257

मैंने आज इसे कुछ PHP कोड में देखा:

$items = $items ?: $this->_handle->result('next', $this->_result, $this);

मैं ?:यहां इस्तेमाल किए जा रहे ऑपरेटर से परिचित नहीं हूं । यह एक टर्नरी ऑपरेटर की तरह दिखता है, लेकिन मूल्यांकन करने के लिए कि क्या विधेय सच है, अभिव्यक्ति छोड़ दी गई है। इसका क्या मतलब है?

जवाबों:


528

यह बाएं ऑपरेंड का मूल्यांकन करता है यदि बाएं ऑपरेंड सत्य है , और सही ऑपरेंड अन्यथा।

स्यूडोकोड में,

foo = bar ?: baz;

लगभग हल करता है

foo = bar ? bar : baz;

या

if (bar) {
    foo = bar;
} else {
    foo = baz;
}

इस अंतर के साथ कि barकेवल एक बार मूल्यांकन किया जाएगा।

आप अपने द्वारा fooपोस्ट किए गए कोड उदाहरण में दिखाए गए अनुसार "सेल्फ-चेक" करने के लिए भी इसका उपयोग कर सकते हैं :

foo = foo ?: bar;

यह आवंटित करेगा barकरने के लिए fooकरता है, तो fooनल या falsey है, वरना यह छोड़ देंगे fooअपरिवर्तित।

कुछ और उदाहरण:

<?php
    var_dump(5 ?: 0); // 5
    var_dump(false ?: 0); // 0
    var_dump(null ?: 'foo'); // 'foo'
    var_dump(true ?: 123); // true
    var_dump('rock' ?: 'roll'); // 'rock'
?>

वैसे, इसे एल्विस ऑपरेटर कहा जाता है ।

एल्विस ऑपरेटर


11
सुनिश्चित करें कि कोष्ठक में चर हालांकि मौजूद है, या आप एक त्रुटि उठाने जा रहे हैं। PHP सिर्फ यह मान नहीं लेगी कि उसका मूल्य nullकुछ भी है। बस '
कहो

20
क्या मजेदार है कि यह उत्तर विकी लेख के साथ एक पुनरावर्ती लूप बनाता है, जिसने पूरी तरह से यह नहीं बताया कि इसे "एल्विस ऑपरेटर" क्यों कहा जाता है।
प्रतीत होता है

41
थोड़ा कम ऑपरेशन, थोड़ा और अभिव्यक्ति कृपया।
आलाप

2
क्यों सिर्फ एक का उपयोग नहीं ||। तो blah || 'default'?
Noitidart

10
@Noitidart क्योंकि, JS के विपरीत, जहाँ यह सबसे बाईं ओर का सत्य ऑपरेंड देता है, PHP में ||ऑपरेटर हमेशा एक बूलियन देता है।
ksadowski

58

डॉक्स देखें :

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


10
उन्हें एक नए डॉक्टर लेखक की आवश्यकता है क्योंकि अनिवार्य रूप से कोई यह पूछेगा कि expr2 का क्या हुआ। मैं सिर्फ इसे फेंक देता हूं।
जॉन के

7
क्या बिल्ली है? मुझे अभी यह पता चला है कि, PHP 7 में अपग्रेड करने के बाद? मैं वर्षों से इसका उपयोग कर सकता था!
ब्यूटेल बटुक

टीबीएच, डॉक्स सही हैं। क्या हुआ expr2कि यह बस गायब हो गया, और मूल्यांकन नहीं किया गया। $this->expensiveComputation() ?: "nope"के समान नहीं है $this->expensiveComputation() ? $this->expensiveComputation() : "nope"- expr1 केवल एक बार मूल्यांकन किया जाता है।
पिस्कोवर ने 13:15 पर भवन

18

सरण के साथ सावधान रहें। हमें एक जाँच चर लिखना चाहिए ?, क्योंकि:

  $params = ['param1' => 'value1',
             'param2' => 'value2',
             'param3' => 'value3',];

  $param1 = isset($params['param1'])?:null;
  $param2 = !empty($params['param2'])?:null;
  $param3 = $params['param3']?:null; // get E_NOTICE, if $params['param3'] eq false

  var_dump($param1,$param2,$param3);
  true // would like to expect `value1`
  true // would like to expect `value2`
  param3 // properly, but problem above

अपडेट किया गया

RFC से। भविष्य में (PHP 7 में) ऑपरेटर नल कोलेसस ऑपरेटर इसे उदाहरण के लिए करेंगे:

$param1 = $params['param1'] ?? null;
// Equivalent to:  $param1 = isset($params['param1']) ? $params['param1'] : null;

1
यह प्रश्न का उत्तर नहीं देता है, न ही यह किसी के लिए उपयोगी है कि वह समझने की कोशिश कर रहा है कि एल्विस ऑपरेटर का उपयोग कब किया जाए।
मार्क अमेरी

7
@ मर्क अमेरी हम्म .. वाकई? Isn`t सहायक? क्या आपने वास्तव में PHP के साथ काम किया था और सरणी के vars को टर्नेरी के साथ उपयोग करने में हजारों मामलों को देखा था? ठीक है, मैंने पाठ को "सरणियों के साथ सावधान रहें .." के लिए बदल दिया
voodoo417

इतना अशक्त मोटे और एल्विस एक ही हैं?
नबील खान

7
@NabeelKhan नहीं! और यह PHP imo में एल्विस ऑपरेटर थोड़े बेकार कर देगा। एल्विस ऑपरेटर एक अभिव्यक्ति का मूल्यांकन करता है और अगर यह सच है, तो वह इसे वापस कर देता है अन्यथा यह अंतिम भाग लौटाता है। चूंकि पीएचपी कम टाइप की जाती है, बहुत सारी चीजें सही या गलत होंगी, और सबसे ज्यादा संभावना यह है कि आप जो चाहते हैं वह नहीं होगा। Ie: आप एक डिफॉल्ट मान को एक वैरिएबल पर सेट करना चाहते हैं यदि इसे परिभाषित नहीं किया गया है, तो एल्विस ऑपरेटर का उपयोग करते हुए PHP कहेगा कि 0 परिभाषित नहीं है, लेकिन आप चाहते हैं कि 0 ... यही कारण है कि PHP 7 को Null Coalesce ऑपरेटर मिलेगा , यह आपके वेरिएबल को नल के खिलाफ कड़ाई से परीक्षण करेगा, इसलिए PHP कहेगा कि 0 अपरिभाषित नहीं है।
ग्रीगोइरे डी।

1
@FuscaSoftware: इस तरह त्रुटि दमन का उपयोग करना मेरे अनुभव में अच्छा विचार नहीं है।
तीज

8

एक और महत्वपूर्ण विचार: एल्विस ऑपरेटर Zend Opcache tokenization प्रक्रिया को तोड़ता है। मुझे यह कठिन तरीका लगा! हालांकि यह बाद के संस्करणों में तय किया गया हो सकता है, मैं इस समस्या की पुष्टि PHP 5.5.38 (इन-बिल्ट ज़ेंड ओपचेचे v7.0.6-देव के साथ) में मौजूद है।

यदि आप पाते हैं कि आपकी कुछ फाइलें Zend Opcache में कैश होने से इनकार करती हैं, तो यह एक कारण हो सकता है ... आशा है कि यह मदद करता है!


4

हाँ, यह PHP 5.3 में नया है। यदि यह TRUE के रूप में मूल्यांकन किया जाता है, या वैकल्पिक मान यदि इसे FALSE के रूप में मूल्यांकित किया जाता है, तो यह या तो परीक्षण अभिव्यक्ति का मूल्य देता है।


2
सूक्ष्म रूप से गलत / भ्रामक; न तो ऑपरेंड को बूलियन होने की जरूरत है। क्या मायने रखता है कि क्या पहला मूल्य सत्य है , क्या नहीं TRUE
मार्क अमेरी

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