जवाबों:
जब आपका पहला तर्क शून्य होता है, तो वे मूल रूप से एक ही होते हैं सिवाय इसके कि 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'
।
$b = []; var_dump($b['a']['b']['c'] ?? 'default');
या वस्तुओं के साथ$b = new Foo; var_dump($b->a()->b()->c() ?? 'default');
$a = [];
। देखें: 3v4l.org/iCCa0
नीचे 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"
??
:??
एक "गेट" जैसा है जो केवल NULL को अनुमति देता है ।NULL
न हो । ??
वैसा ही है( !isset() || is_null() )
?:
?:
एक फाटक की तरह है जो इसके anything falsy
माध्यम से देता हैNULL
0
, empty string
, NULL
, false
, !isset()
, empty()
.. कुछ भी है कि falsy बदबू आ रही हैecho ($x ? $x : false)
?:
फेंक देंगेPHP NOTICE
unset
!isset()
??
और ?:
..?:
जब
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();
टर्नरी ऑपरेटर को किया जा सकता है ढेर ...
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 {}
नल कोल ऑपरेटर को किया जा सकता है ढेर ...
$v = $x ?? $y ?? $z;
यह एक क्रम है:
if(!isset($x) || is_null($x) ) {}
else if(!isset($y) || is_null($y) ) {}
else {}
स्टैकिंग का उपयोग करते हुए, मैं इसे छोटा कर सकता हूं:
if(!isset($_GET['name'])){
if($user_name){
$name = $user_name;
}else {
$name = 'anonymous';
}
} else {
$name = $_GET['name'];
}
इसके लिए:
$name = $_GET['name'] ?? $user_name ?: 'anonymous';
बिल्कुल सटीक? :-)
यदि आप इस तरह से शॉर्टकट टर्नरी ऑपरेटर का उपयोग करते हैं, तो यह $_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';
अब यह एक उचित तालमेल ऑपरेटर है।
प्रमुख अंतर यह है कि
त्रिगुट ऑपरेटर अभिव्यक्ति expr1 ?: expr3
रिटर्न expr1
अगर expr1
करने के लिए मूल्यांकन करता है
TRUE
लेकिन दूसरी ओर अशक्त वालों ऑपरेटर अभिव्यक्ति (expr1) ?? (expr2)
मूल्यांकन करने के लिए expr1
करता है, तो expr1
है नहीं NULL
टर्नरी ऑपरेटर expr1 ?: expr3
एक नोटिस का उत्सर्जन करता है यदि बाएं हाथ की साइड वैल्यू (expr1)
मौजूद नहीं है, लेकिन दूसरी ओर नल कोलेसिंग ऑपरेटर (expr1) ?? (expr2)
विशेष रूप से, किसी नोटिस का उत्सर्जन नहीं करता है यदि लेफ्ट-हैंड साइड वैल्यू (expr1)
मौजूद नहीं है, जैसे isset()
।
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; इसलिए रिटर्न-बाय-रेफरेंस फ़ंक्शन काम नहीं करेगा और चेतावनी जारी की जाती है।
डायनामिक डेटा हैंडलिंग की बात आती है तो दोनों अलग-अलग व्यवहार करते हैं।
यदि वेरिएबल खाली है ('') अशक्त तालमेल चर को सत्य मान लेगा, लेकिन शॉर्टहैंड टर्नरी ऑपरेटर नहीं करेगा। और यह ध्यान में रखना है।
$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
It returns its first operand if it exists and is not NULL; otherwise it returns its second operand
।
दोनों लंबे एक्सप्रेशन के लिए शॉर्टहैंड हैं।
?:
के लिए छोटा है $a ? $a : $b
। यह अभिव्यक्ति $ का मूल्यांकन करेगी यदि $ TRUE का मूल्यांकन करता है ।
??
के लिए छोटा है isset($a) ? $a : $b
। यह अभिव्यक्ति $ का मूल्यांकन करेगा यदि $ a सेट है और शून्य नहीं है।
जब $ a अपरिभाषित या अशक्त हो, तो उनके उपयोग के मामले ओवरलैप हो जाते हैं। जब $ a अपरिभाषित होता है ??
तो E_NOTICE का उत्पादन नहीं करेगा, लेकिन परिणाम समान होते हैं। जब $ एक शून्य है परिणाम समान है।
शुरुआती लोगों के लिए:
अशक्त सहवर्ती ऑपरेटर (??)
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"
यह मूल रूप से चर की जाँच करता है (सरणी सूचकांक, ऑब्जेक्ट विशेषता .. आदि) मौजूद है और नहीं null
। isset
कार्य के समान
टर्नरी ऑपरेटर शॉर्टहैंड (?)
हर झूठी बातें ( 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: ..
उम्मीद है की यह मदद करेगा
इस लिंक पर नीचे स्क्रॉल करें और अनुभाग देखें, यह आपको एक तुलनात्मक उदाहरण देता है जैसा कि नीचे देखा गया है:
<?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 नहीं है तो यह अपना पहला ऑपरेंड लौटाता है; अन्यथा यह अपना दूसरा ऑपरेंड वापस करता है।
अनिवार्य रूप से, कोलेसिंग ऑपरेटर का उपयोग करने से यह टर्नरी ऑपरेटर के विपरीत नल के लिए ऑटो जांच करेगा।
a || b || c
जेएस में आम पैटर्न की तरह दिखता है , सिवाय PHP के false || 2
false ?? 2
अन्य उत्तर गहरे जाते हैं और बड़ी व्याख्याएँ देते हैं। त्वरित उत्तर की तलाश करने वालों के लिए,
$a ?: 'fallback'
है $a ? $a : 'fallback'
जबकि
$a ?? 'fallback'
है $a = isset($a) ? $a : 'fallback'
मुख्य अंतर यह होगा कि बाएं ऑपरेटर या तो है:
0
, ''
, false
, []
, ...)$a =
उपरोक्त विस्तार में नहीं होना चाहिए ??
। $ a के मूल्य को सेट या परिवर्तित $a ?? 'fallback'
नहीं करता है। (यह केवल एक मूल्य देता है)।
ऐसा लगता है कि ??
या तो उपयोग करने के लिए पेशेवरों और विपक्ष हैं या ?:
। उपयोग करने के लिए समर्थक ?:
यह है कि यह गलत और अशक्त और "" का मूल्यांकन करता है। चुनाव यह है कि यह एक 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 को नहीं फेंकेगी ...
?? null ?:
बहुत बढ़िया बात है, धन्यवाद श्री। होशियार लाडका।
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.
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'])
पहले उदाहरण में वैसे भी बेमानी है
$ _GET या $ _REQUEST जैसे सुपरग्लोब का उपयोग करते समय आपको पता होना चाहिए कि वे एक खाली स्ट्रिंग हो सकते हैं। इस स्पेकल केस में यह उदाहरण है
$username = $_GET['user'] ?? 'nobody';
विफल हो जाएगा क्योंकि $ उपयोगकर्ता नाम का मूल्य अब एक रिक्त स्ट्रिंग है।
इसलिए $ _GET या $ _REQUEST का उपयोग करते समय आपको इसके बजाय टर्नरी ऑपरेटर का उपयोग करना चाहिए:
$username = (!empty($_GET['user'])?$_GET['user']:'nobody';
अब $ उपयोगकर्ता नाम का मूल्य अपेक्षित रूप से 'कोई नहीं' है।