PHP ternary ऑपरेटर बनाम null coalescing ऑपरेटर


341

क्या कोई व्यक्ति PHP में टर्नरी ऑपरेटर शॉर्टहैंड ( ?:) और अशक्त कोलेसिंग ऑपरेटर ( ??) के बीच अंतर समझा सकता है ?

वे कब अलग व्यवहार करते हैं और कब उसी तरीके से (यदि ऐसा होता भी है)?

$a ?: $b

बनाम

$a ?? $b

जवाबों:


344

जब आपका पहला तर्क शून्य होता है, तो वे मूल रूप से एक ही होते हैं सिवाय इसके कि E_NOTICEजब आप एक अपरिभाषित चर रखते हैं, तो शून्य तालमेल आउटपुट नहीं होगा । पीएचपी 7.0 प्रवास डॉक्स इस कहना है:

अशक्त coalescing संचालक (??) isset () के साथ संयोजन में एक ternary का उपयोग करने की जरूरत के सामान्य मामले के लिए वाक्यविन्यास चीनी के रूप में जोड़ा गया है। यदि यह मौजूद है और NULL नहीं है तो यह अपना पहला ऑपरेंड लौटाता है; अन्यथा यह अपना दूसरा ऑपरेंड वापस करता है।

इसे प्रदर्शित करने के लिए यहां कुछ उदाहरण कोड दिए गए हैं:

<?php

$a = null;

print $a ?? 'b'; // b
print "\n";

print $a ?: 'b'; // b
print "\n";

print $c ?? 'a'; // a
print "\n";

print $c ?: 'a'; // Notice: Undefined variable: c in /in/apAIb on line 14
print "\n";

$b = array('a' => null);

print $b['a'] ?? 'd'; // d
print "\n";

print $b['a'] ?: 'd'; // d
print "\n";

print $b['c'] ?? 'e'; // e
print "\n";

print $b['c'] ?: 'e'; // Notice: Undefined index: c in /in/apAIb on line 33
print "\n";

जिन लाइनों पर नोटिस लगा है, वे हैं जहाँ मैं शॉर्ट टर्नरी ऑपरेटर का उपयोग कर रहा हूँ, अशक्त कोलेसिंग ऑपरेटर के विपरीत। हालाँकि, नोटिस के साथ भी, PHP वही प्रतिक्रिया वापस देगी।

कोड निष्पादित करें: https://3v4l.org/McavC

बेशक, यह हमेशा पहली दलील मान रहा है null। एक बार जब यह शून्य नहीं रह जाता है, तो आप इसमें मतभेद खत्म कर देते हैं कि ??ऑपरेटर हमेशा पहला तर्क लौटाएगा जबकि ?:शॉर्टहैंड केवल तभी होगा जब पहला तर्क सत्य था, और यह इस बात पर निर्भर करता है कि PHP किस तरह से एक बूलियन को टाइप-कास्ट करेगा

इसलिए:

$a = false ?? 'f'; // false
$b = false ?: 'g'; // 'g'

तब के $aबराबर falseऔर $bबराबर होगा 'g'


8
युक्ति: यदि आप उपयोग कर रहे हैं ?? इसके बजाय?: लेकिन फिर अपने आप को अपने कोड को 7 से अधिक पुराने PHP संस्करणों के साथ संगत बनाने की आवश्यकता है (पूर्व के लिए एक प्लगइन के लिए), तो आप बाहर स्वैप करना चाहते हो सकता है ?? isset ($ कुछ) के साथ? $ कुछ: $ some_else अपने कोड में हर जगह। आप आसानी से Notepad ++ या nedit (और अन्य संपादकों को भी) / खोज उपकरण का उपयोग करके, नियमित अभिव्यक्ति विकल्प का चयन करके और खोज फ़ील्ड में सम्मिलित करके ऐसा कर सकते हैं: "\ s * (\ S +) \ s * \ _?"? और बदले हुए क्षेत्र में: "isset ($ 1)? $ 1:" उद्धरण के बिना (nedit $ 1 के बजाय \ 1 का उपयोग करता है)। फिर सभी को बदल दें।
डेमियन ग्रीन

14
यह सही उत्तर है, हालांकि सत्यता की जांच प्रमुख भिन्नता है और इस पर अधिक जोर दिया जाना चाहिए।
मंगल

2
@MasterOdin आपके उत्तर से संतुष्ट नहीं है। दोनों समान नहीं हैं। अलग परिणाम है।
जिज्ञासु

1
यह ध्यान देने योग्य है कि आप उपयोग कर सकते हैं ?? जंजीर के साथ। उदाहरण के लिए: $b = []; var_dump($b['a']['b']['c'] ?? 'default');या वस्तुओं के साथ$b = new Foo; var_dump($b->a()->b()->c() ?? 'default');
जैक बी

कृपया ध्यान रखें कि व्यवहार भी अलग है $a = [];। देखें: 3v4l.org/iCCa0
सौलीवनेह

75

नीचे php इंटरेक्टिव मोड php -aपर ( टर्मिनल पर) भाग गया। प्रत्येक पंक्ति पर टिप्पणी परिणाम दिखाती है।

var_dump (false ?? 'value2');   # bool(false)
var_dump (true  ?? 'value2');   # bool(true)
var_dump (null  ?? 'value2');   # string(6) "value2"
var_dump (''    ?? 'value2');   # string(0) ""
var_dump (0     ?? 'value2');   # int(0)

var_dump (false ?: 'value2');   # string(6) "value2"
var_dump (true  ?: 'value2');   # bool(true)
var_dump (null  ?: 'value2');   # string(6) "value2"
var_dump (''    ?: 'value2');   # string(6) "value2"
var_dump (0     ?: 'value2');   # string(6) "value2"

तो यह मेरी व्याख्या है:

1. अशक्त वालों ऑपरेटर - ??:

  • ??एक "गेट" जैसा है जो केवल NULL को अनुमति देता है
  • इसलिए, यह हमेशा पहला पैरामीटर देता है , जब तक कि पहला पैरामीटरNULLहो
  • यह साधन ??वैसा ही है( !isset() || is_null() )

2. टर्नरी ऑपरेटर - ?:

  • ?:एक फाटक की तरह है जो इसके anything falsyमाध्यम से देता हैNULL
  • 0, empty string, NULL, false, !isset(), empty().. कुछ भी है कि falsy बदबू आ रही है
  • क्लासिक टर्नरी ऑपरेटर की तरह: echo ($x ? $x : false)
  • नोट: अपरिभाषित ( या ) चर पर ?:फेंक देंगेPHP NOTICEunset!isset()

3. तो डॉक्टर, मैं का उपयोग करें जब करना ??और ?:..

  • मैं केवल मजाक कर रहा हूं - मैं डॉक्टर नहीं हूं और यह सिर्फ एक व्याख्या है
  • मैं का प्रयोग करेंगे ?:जब
    • empty($x)जाँच कर रहा है
    • जैसे क्लासिक टर्नरी ऑपरेशन !empty($x) ? $x : $yको छोटा किया जा सकता है$x ?: $y
    • if(!$x) { fn($x); } else { fn($y); } को छोटा किया जा सकता है fn(($x ?: $y))
  • मैं का प्रयोग करेंगे ??जब
    • मैं एक !isset() || is_null()चेक करना चाहता हूं
    • उदाहरण के लिए जाँच करें कि क्या कोई वस्तु मौजूद है - $object = $object ?? new objClassName();

4. स्टैकिंग ऑपरेटर ...

  1. टर्नरी ऑपरेटर को किया जा सकता है ढेर ...

    echo 0 ?: 1 ?: 2 ?: 3; //1
    echo 1 ?: 0 ?: 3 ?: 2; //1
    echo 2 ?: 1 ?: 0 ?: 3; //2
    echo 3 ?: 2 ?: 1 ?: 0; //3
    
    echo 0 ?: 1 ?: 2 ?: 3; //1
    echo 0 ?: 0 ?: 2 ?: 3; //2
    echo 0 ?: 0 ?: 0 ?: 3; //3
    

    इस कोड के लिए स्रोत और क्रेडिट

    यह मूल रूप से इसका एक क्रम है:

    if( truthy ) {}
    else if(truthy ) {}
    else if(truthy ) {}
    ..
    else {}
    
  2. नल कोल ऑपरेटर को किया जा सकता है ढेर ...

    $v = $x ?? $y ?? $z; 

    यह एक क्रम है:

    if(!isset($x) || is_null($x) ) {} 
    else if(!isset($y) || is_null($y) ) {}
    else {}
    
  3. स्टैकिंग का उपयोग करते हुए, मैं इसे छोटा कर सकता हूं:

    if(!isset($_GET['name'])){
       if($user_name){
          $name = $user_name;
       }else {
          $name = 'anonymous';
       }
    } else { 
       $name = $_GET['name'];
    }
    

    इसके लिए:

    $name = $_GET['name'] ?? $user_name ?: 'anonymous';

    बिल्कुल सटीक? :-)


3
अब तक का सबसे अच्छा जवाब
फैजान अनवर अली रूपानी

69

यदि आप इस तरह से शॉर्टकट टर्नरी ऑपरेटर का उपयोग करते हैं, तो यह $_GET['username']सेट नहीं होने पर एक नोटिस का कारण होगा :

$val = $_GET['username'] ?: 'default';

तो इसके बजाय आपको ऐसा कुछ करना होगा:

$val = isset($_GET['username']) ? $_GET['username'] : 'default';

अशक्त कोलेसिंग ऑपरेटर ऊपर बयान के बराबर है, और 'डिफ़ॉल्ट' वापस आ जाएगी, तो $_GET['username']सेट या है नहीं कर रहा है null:

$val = $_GET['username'] ?? 'default';

ध्यान दें कि यह सत्यता की जांच नहीं करता है । यह केवल तभी चेक करता है जब वह सेट हो और शून्य न हो।

आप यह भी कर सकते हैं, और पहले परिभाषित (सेट और नहीं null) मूल्य वापस किया जाएगा:

$val = $input1 ?? $input2 ?? $input3 ?? 'default';

अब यह एक उचित तालमेल ऑपरेटर है।


42

प्रमुख अंतर यह है कि

  1. त्रिगुट ऑपरेटर अभिव्यक्ति expr1 ?: expr3रिटर्न expr1अगर expr1करने के लिए मूल्यांकन करता है TRUEलेकिन दूसरी ओर अशक्त वालों ऑपरेटर अभिव्यक्ति (expr1) ?? (expr2) मूल्यांकन करने के लिए expr1करता है, तो expr1है नहीं NULL

  2. टर्नरी ऑपरेटर expr1 ?: expr3 एक नोटिस का उत्सर्जन करता है यदि बाएं हाथ की साइड वैल्यू (expr1) मौजूद नहीं है, लेकिन दूसरी ओर नल कोलेसिंग ऑपरेटर (expr1) ?? (expr2) विशेष रूप से, किसी नोटिस का उत्सर्जन नहीं करता है यदि लेफ्ट-हैंड साइड वैल्यू (expr1) मौजूद नहीं है, जैसे isset()

  3. TernaryOperator साहचर्य छोड़ दिया है

    ((true ? 'true' : false) ? 't' : 'f');

    Null Coalescing Operator सही सहयोगी है

    ($a ?? ($b ?? $c));

अब उदाहरण के बीच के अंतर की व्याख्या करते हैं:

टर्नरी ऑपरेटर (?:)

$x='';
$value=($x)?:'default';
var_dump($value);

// The above is identical to this if/else statement
if($x){
  $value=$x;
}
else{
  $value='default';
}
var_dump($value);

अशक्त सहचालक (??)

$value=($x)??'default';
var_dump($value);

// The above is identical to this if/else statement
if(isset($x)){
  $value=$x;
}
else{
  $value='default';
}
var_dump($value);

यहाँ तालिका है जो अंतर और समानता के बीच '??'और की व्याख्या करती है?:

यहां छवि विवरण दर्ज करें

विशेष नोट: अशक्त co ऑपरेटर और ternary ऑपरेटर एक अभिव्यक्ति है, और यह एक चर का मूल्यांकन नहीं करता है, लेकिन एक अभिव्यक्ति के परिणाम के लिए। यह जानना महत्वपूर्ण है कि क्या आप संदर्भ द्वारा एक चर वापस करना चाहते हैं। बयान वापसी $ फू ?? बार $; और $ var == 42 लौटाएँ? $ a: $ b; इसलिए रिटर्न-बाय-रेफरेंस फ़ंक्शन काम नहीं करेगा और चेतावनी जारी की जाती है।


15

डायनामिक डेटा हैंडलिंग की बात आती है तो दोनों अलग-अलग व्यवहार करते हैं।

यदि वेरिएबल खाली है ('') अशक्त तालमेल चर को सत्य मान लेगा, लेकिन शॉर्टहैंड टर्नरी ऑपरेटर नहीं करेगा। और यह ध्यान में रखना है।

$a = NULL;
$c = '';

print $a ?? '1b';
print "\n";

print $a ?: '2b';
print "\n";

print $c ?? '1d';
print "\n";

print $c ?: '2d';
print "\n";

print $e ?? '1f';
print "\n";

print $e ?: '2f';

और आउटपुट:

1b
2b

2d
1f

Notice: Undefined variable: e in /in/ZBAa1 on line 21
2f

लिंक: https://3v4l.org/ZBAa1


यह PHP के लिए स्पष्ट रूप से काउंटर सहज है, जहां एक खाली स्ट्रिंग को आमतौर पर गलत माना जाता है। फिर भी यह डॉक्स के लिए स्पष्ट रूप से इंगित किया गया है:? It returns its first operand if it exists and is not NULL; otherwise it returns its second operand
सिमोन

12

दोनों लंबे एक्सप्रेशन के लिए शॉर्टहैंड हैं।

?:के लिए छोटा है $a ? $a : $b। यह अभिव्यक्ति $ का मूल्यांकन करेगी यदि $ TRUE का मूल्यांकन करता है ।

??के लिए छोटा है isset($a) ? $a : $b। यह अभिव्यक्ति $ का मूल्यांकन करेगा यदि $ a सेट है और शून्य नहीं है।

जब $ a अपरिभाषित या अशक्त हो, तो उनके उपयोग के मामले ओवरलैप हो जाते हैं। जब $ a अपरिभाषित होता है ??तो E_NOTICE का उत्पादन नहीं करेगा, लेकिन परिणाम समान होते हैं। जब $ एक शून्य है परिणाम समान है।


5

शुरुआती लोगों के लिए:

अशक्त सहवर्ती ऑपरेटर (??)

nullमूल्यों और अपरिभाषित को छोड़कर सब कुछ सच है (चर / सरणी सूचकांक / वस्तु विशेषताएँ)

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

$array = [];
$object = new stdClass();

var_export (false ?? 'second');                           # false
var_export (true  ?? 'second');                           # true
var_export (null  ?? 'second');                           # 'second'
var_export (''    ?? 'second');                           # ""
var_export ('some text'    ?? 'second');                  # "some text"
var_export (0     ?? 'second');                           # 0
var_export ($undefinedVarible ?? 'second');               # "second"
var_export ($array['undefined_index'] ?? 'second');       # "second"
var_export ($object->undefinedAttribute ?? 'second');     # "second"

यह मूल रूप से चर की जाँच करता है (सरणी सूचकांक, ऑब्जेक्ट विशेषता .. आदि) मौजूद है और नहीं nullissetकार्य के समान

टर्नरी ऑपरेटर शॉर्टहैंड (?)

हर झूठी बातें ( false, null, 0, रिक्त स्ट्रिंग) झूठे के रूप में आ रहे हैं, लेकिन अगर यह एक अपरिभाषित है यह भी झूठी के रूप में आ लेकिन Noticeफेंक होगा

भूतपूर्व

$array = [];
$object = new stdClass();

var_export (false ?: 'second');                           # "second"
var_export (true  ?: 'second');                           # true
var_export (null  ?: 'second');                           # "second"
var_export (''    ?: 'second');                           # "second"
var_export ('some text'    ?? 'second');                  # "some text"
var_export (0     ?: 'second');                           # "second"
var_export ($undefinedVarible ?: 'second');               # "second" Notice: Undefined variable: ..
var_export ($array['undefined_index'] ?: 'second');       # "second" Notice: Undefined index: ..
var_export ($object->undefinedAttribute ?: 'second');     # "Notice: Undefined index: ..

उम्मीद है की यह मदद करेगा


4

इस लिंक पर नीचे स्क्रॉल करें और अनुभाग देखें, यह आपको एक तुलनात्मक उदाहरण देता है जैसा कि नीचे देखा गया है:

<?php
/** Fetches the value of $_GET['user'] and returns 'nobody' if it does not exist. **/
$username = $_GET['user'] ?? 'nobody';
/** This is equivalent to: **/
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

/** Coalescing can be chained: this will return the first defined value out of $_GET['user'], $_POST['user'], and 'nobody'. **/
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>

हालांकि, ऑपरेटरों को चेन करने की सलाह नहीं दी जाती है क्योंकि बाद में इसे पढ़ते समय कोड को समझना मुश्किल हो जाता है।

अशक्त coalescing संचालक (??) isset () के साथ संयोजन में एक ternary का उपयोग करने की जरूरत के सामान्य मामले के लिए वाक्यविन्यास चीनी के रूप में जोड़ा गया है। यदि यह मौजूद है और NULL नहीं है तो यह अपना पहला ऑपरेंड लौटाता है; अन्यथा यह अपना दूसरा ऑपरेंड वापस करता है।

अनिवार्य रूप से, कोलेसिंग ऑपरेटर का उपयोग करने से यह टर्नरी ऑपरेटर के विपरीत नल के लिए ऑटो जांच करेगा।


1
कृपया चैनिंग पर विचार न करें ... जंजीरों के रूप में पढ़ना / समझना उतना ही मुश्किल है
मार्क बेकर

7
@ मर्कबैकर जंजीरों की गुठली को समझना मुश्किल है क्योंकि PHP ने त्रिगुट सहक्रियाशीलता को तोड़ दिया है। यह कोलेसस ऑपरेटर पर लागू नहीं होता है और इमो चेनेड कोलेसस पूरी तरह से समझ में आता है।
निकीक

7
मैं असहमत हूं। अशक्त कोलेस का पीछा करना एक महान विशेषता है, और यदि आप ऑपरेटर को समझते हैं तो इसे पढ़ना मुश्किल नहीं है। यह आमतौर पर जावास्क्रिप्ट में उपयोग किया जाता है और एक बार जब लोग PHP में इसके साथ सहज हो जाते हैं तो चेनिंग का उपयोग नहीं करना चाहिए। चर्मकार चारणों को पढ़ना बहुत कठिन है, लेकिन अशक्त सहवास आसान है। जैसा कि आप बाएं से दाएं पढ़ते हैं, यह सिर्फ सूचीबद्ध करता है कि आगे किस मूल्य का उपयोग किया जाना चाहिए।
16

2
यह a || b || cजेएस में आम पैटर्न की तरह दिखता है , सिवाय PHP के false || 2false ?? 2
बूलियंस के

1
मैं आपके और अन्य लोगों के साथ असहमति का उपयोग नहीं कर रहा हूँ। यह कहना है कि छोरों के लिए कभी उपयोग न करें क्योंकि उन्हें समझ में नहीं आ सकता है। डेवलपर्स / कोडर्स कोडिंग मानकों और प्रथाओं का उपयोग करने के लिए पूरी तरह से स्वतंत्र हैं, जो वे समझते हैं, भले ही दूसरों को नहीं। व्यक्तिगत रूप से, मैं जंजीरों को बदलते बयानों के समान जंजीरदार देखता हूं। यह पाया गया पहला मान लौटाता है (सेट), और अंतिम मान यदि कुछ नहीं मिला है।
kurdtpage

3

अन्य उत्तर गहरे जाते हैं और बड़ी व्याख्याएँ देते हैं। त्वरित उत्तर की तलाश करने वालों के लिए,

$a ?: 'fallback' है $a ? $a : 'fallback'

जबकि

$a ?? 'fallback' है $a = isset($a) ? $a : 'fallback'


मुख्य अंतर यह होगा कि बाएं ऑपरेटर या तो है:

  • एक falsy मूल्य है कि रिक्त नहीं है ( 0, '', false, [], ...)
  • एक अपरिभाषित चर

$a =उपरोक्त विस्तार में नहीं होना चाहिए ??। $ a के मूल्य को सेट या परिवर्तित $a ?? 'fallback' नहीं करता है। (यह केवल एक मूल्य देता है)।
चल रहा

2

ऐसा लगता है कि ??या तो उपयोग करने के लिए पेशेवरों और विपक्ष हैं या ?:। उपयोग करने के लिए समर्थक ?:यह है कि यह गलत और अशक्त और "" का मूल्यांकन करता है। चुनाव यह है कि यह एक E_NOTICE की रिपोर्ट करता है यदि पूर्ववर्ती तर्क शून्य है। ??समर्थक के साथ यह है कि कोई E_NOTICE नहीं है, लेकिन यह है कि यह गलत का मूल्यांकन नहीं करता है और उसी को शून्य करता है। अपने अनुभव में, मैंने देखा है कि लोग अशक्त और गलत तरीके से परस्पर प्रयोग करना शुरू कर देते हैं, लेकिन फिर वे अंततः अपने कोड को संशोधित करने का सहारा लेते हैं या तो अशक्त या गलत का उपयोग करने के लिए, लेकिन दोनों नहीं। एक वैकल्पिक एक अधिक विस्तृत टर्नरी स्थिति बनाने के लिए है (isset($something) or !$something) ? $something : $something_else:।

निम्नलिखित ??अशक्त और असत्य दोनों का उपयोग कर ऑपरेटर के उपयोग के अंतर का एक उदाहरण है :

$false = null;
$var = $false ?? "true";
echo $var . "---<br>";//returns: true---

$false = false;
$var = $false ?? "true";
echo $var . "---<br>"; //returns: ---

हालांकि, टर्नरी ऑपरेटर पर विस्तार से, हम एक गलत या खाली स्ट्रिंग बना सकते हैं "" मानो कि यह एक e_notice फेंकने के बिना एक अशक्त था:

$false = null;
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---<br>";//returns: ---

$false = false;
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---<br>";//returns: ---

$false = "";
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---<br>";//returns: ---

$false = true;
$var = (isset($false) or !$false) ? $false : "true";
echo $var . "---<br>";//returns: 1---

व्यक्तिगत रूप से, मुझे लगता है कि अगर पीएचपी के भविष्य के संशोधन में एक और नया ऑपरेटर शामिल होता है तो यह वास्तव में अच्छा होगा: :?जो उपरोक्त सिंटैक्स को प्रतिस्थापित करता है। अर्थात: // $var = $false :? "true";यह वाक्य रचना शून्य, असत्य और "" का समान रूप से मूल्यांकन करेगी और E_NOTICE को नहीं फेंकेगी ...


3
आप $ var = $ false का उपयोग कर सकते हैं ?? अशक्त ;: "स्ट्रिंग खाली / गलत / अशक्त / अपरिभाषित है";
RedSparr0w

वाह ... ?? null ?:बहुत बढ़िया बात है, धन्यवाद श्री। होशियार लाडका।
ब्लेन लाफ्रीनियर

1
class a
{
    public $a = 'aaa';
}

$a = new a();

echo $a->a;  // Writes 'aaa'
echo $a->b;  // Notice: Undefined property: a::$b

echo $a->a ?? '$a->a does not exists';  // Writes 'aaa'

// Does not throw an error although $a->b does not exist.
echo $a->b ?? '$a->b does not exist.';  // Writes $a->b does not exist.

// Does not throw an error although $a->b and also $a->b->c does not exist.
echo $a->b->c ?? '$a->b->c does not exist.';  // Writes $a->b->c does not exist.

0

Null Coalescing operatorकेवल दो कार्य करता है: यह जाँच करता है whether the variable is setऔर whether it is null। निम्नलिखित उदाहरण पर एक नज़र डालें:

<?php
# case 1:
$greeting = 'Hola';
echo $greeting ?? 'Hi There'; # outputs: 'Hola'

# case 2:
$greeting = null;
echo $greeting ?? 'Hi There'; # outputs: 'Hi There'

# case 3:
unset($greeting);
echo $greeting ?? 'Hi There'; # outputs: 'Hi There'

उपरोक्त कोड उदाहरण बताता है कि Null Coalescing operatorएक गैर-मौजूदा चर और एक चर का व्यवहार करता है जो NULLउसी तरह से सेट होता है ।

Null Coalescing operatorपर एक सुधार है ternary operator। निम्नलिखित कोड स्निपेट पर एक नज़र डालें, दोनों की तुलना:

<?php /* example: checking for the $_POST field that goes by the name of 'fullname'*/
# in ternary operator
echo "Welcome ", (isset($_POST['fullname']) && !is_null($_POST['fullname']) ? $_POST['fullname'] : 'Mr. Whosoever.'); # outputs: Welcome Mr. Whosoever.
# in null coalecing operator
echo "Welcome ", ($_POST['fullname'] ?? 'Mr. Whosoever.'); # outputs: Welcome Mr. Whosoever.

तो, दोनों के बीच अंतर यह है कि Null Coalescing operatorऑपरेटर को अपरिभाषित चर को बेहतर तरीके से संभालने के लिए डिज़ाइन किया गया है ternary operator। जबकि, के ternary operatorलिए एक आशुलिपि है if-else

Null Coalescing operatorप्रतिस्थापित करने के लिए नहीं है ternary operator, लेकिन उपरोक्त उदाहरण में कुछ उपयोग के मामलों में, यह आपको कम परेशानी के साथ स्वच्छ कोड लिखने की अनुमति देता है।

क्रेडिट: http://dwellupper.io/post/6/php7-null-coalescing-operator-usage-and-examples


isset($_POST['fullname'])पहले से ही NULLमूल्यों के लिए जाँच - तो && !is_null($_POST['fullname'])पहले उदाहरण में वैसे भी बेमानी है
यार्न यू।

0

$ _GET या $ _REQUEST जैसे सुपरग्लोब का उपयोग करते समय आपको पता होना चाहिए कि वे एक खाली स्ट्रिंग हो सकते हैं। इस स्पेकल केस में यह उदाहरण है

$username = $_GET['user'] ?? 'nobody';

विफल हो जाएगा क्योंकि $ उपयोगकर्ता नाम का मूल्य अब एक रिक्त स्ट्रिंग है।

इसलिए $ _GET या $ _REQUEST का उपयोग करते समय आपको इसके बजाय टर्नरी ऑपरेटर का उपयोग करना चाहिए:

$username = (!empty($_GET['user'])?$_GET['user']:'nobody';

अब $ उपयोगकर्ता नाम का मूल्य अपेक्षित रूप से 'कोई नहीं' है।


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