एक चर को एक डिफ़ॉल्ट मान देने का सबसे अच्छा तरीका (अनुकरण पर्ल, || = ||


134

मैं पर्ल में इस तरह की चीज करना पसंद करता हूं: यदि खाली या अपरिभाषित है, तो $foo = $bar || $bazउसे असाइन $bazकरना । आप यह भी है जो केवल आवंटित करेगा करने के लिए करता है, तो परिभाषित या रिक्त नहीं है।$foo$bar$foo ||= $bletch$bletch$foo$foo

इस स्थिति में टर्नरी ऑपरेटर थकाऊ और थकाऊ है। निश्चित रूप से PHP में एक सरल, सुंदर विधि उपलब्ध है?

या केवल एक कस्टम फ़ंक्शन का उत्तर है जो isset () का उपयोग करता है?



1
BTW वांछित कार्यशीलता के साथ पर्ल ऑपरेटर हैं //और //=और वे पर्ल v5.10.0 के रूप में मौजूद हैं। तार्किक मूल्य के लिए मूल ||और ||=परीक्षण, परिभाषितता के लिए नहीं।
पालक

@Palec, 29 अपवोट्स के साथ 4 साल पुराने प्रश्न को 6 अपवोट्स के साथ 1-वर्षीय प्रश्न के डुप्लिकेट के रूप में क्यों पहचाना जाएगा (जो स्वयं एक अन्य प्रश्न के डुप्लिकेट के रूप में चिह्नित किया गया था?) मुझे लगता है कि इसे रखने में बहुत अच्छा मूल्य है? प्रश्न, जैसा कि शीर्षक अधिक सामान्य है (उत्तर का संदर्भ नहीं देता है: isset ())।
टॉम ऑस्टर

वे स्पष्ट और सटीक डुप्लिकेट हैं। यह स्वीकार करता हूं कि मैंने इस बारे में ज्यादा नहीं सोचा था कि कौन सा मूल होना चाहिए, मैं किसी और चीज के बीच में था, दोनों के बीच एक कड़ी बनाना लक्ष्य था। मेरे वीटीसी को वापस लेना।
19

एक सटीक डुप्लिकेट, चिह्नित (IMO त्रुटिपूर्ण रूप से) एक और प्रश्न के डुप्लिकेट के रूप में: isset () के लिए PHP शॉर्टहैंड?
पालिक

जवाबों:


130

PHP 7 में आखिरकार हमारे पास ऐसा करने का एक तरीका है। इसे नल कोलेसिंग ऑपरेटर कहा जाता है । आप इसे इस तरह से उपयोग कर सकते हैं:

$name = $_GET['name'] ?? 'john doe';

इसके बराबर है

$name = isset($_GET['name']) ? $_GET['name']:'john doe';

14
मैं तर्क देता हूं कि स्पेसशिप ऑपरेटर के पास भी योग्यता है।
मारियानो

3
मुझे लगा कि मारियानो हमारे पैर खींच रहा था, लेकिन यह एक बात है <=>और बूट करने के लिए बहुत सटीक है!
HPWD

1
ध्यान दें कि अशक्त coalescing संचालक सशर्त संचालक से अलग व्यवहार करता है, क्योंकि यह एक nullमूल्य के लिए विशिष्ट है । उदाहरण के लिए, यदि $_GET['name']एक खाली स्ट्रिंग पर सेट किया गया है, तो पहली पंक्ति एक खाली स्ट्रिंग लौटाएगी, लेकिन हम "जॉन डो" का उपयोग करके वापस कर सकते हैं $_GET['name'] ? $_GET['name'] : 'john doe'
विप्रहोम

211

PHP 5.3 में एक शॉर्टहैंड ?:ऑपरेटर होता है:

$foo = $bar ?: $baz;

जो असाइन करता है $barयदि यह एक खाली मान नहीं है (मुझे नहीं पता कि यह पर्ल से PHP में कैसे भिन्न होगा), अन्यथा $baz, और पर्ल और PHP के पुराने संस्करणों में भी ऐसा ही है:

$foo = $bar ? $bar : $baz;

लेकिन PHP में इसके लिए कोई कंपाउंड असाइनमेंट ऑपरेटर नहीं है (यानी, पर्ल के बराबर नहीं है ||=)।

इसके अलावा, PHP $barतब तक शोर मचाएगा जब तक कि आप तब तक सेट न करें जब तक कि आप नोटिस बंद न कर दें। इसके बीच एक अर्थ अंतर भी है isset()और empty()। यदि वेरिएबल मौजूद नहीं है, या सेट है, तो पूर्व रिटर्न गलत है NULL। बाद सच रिटर्न यह अस्तित्व में नहीं करता है, या करने के लिए सेट कर दिया जाता 0, '', falseया NULL


2
+1 करने के लिए मुझे अभी तक 5.3 की एक और महान विशेषता से परिचित कराने के लिए मैं अपने RHEL5 / PHP5.1.2 सर्वर में लापता हूं।
माइकल बर्कोव्स्की

मुझे लगता है कि आप अपने दंडनीय वाक्य के The first returnsबजाय इसका मतलब है The second
टोटो

21
ध्यान दें कि यदि आपका चर अपरिभाषित है, तो PHP इसके बारे में नोटिस फेंक देगी। यह, दुर्भाग्य से, इसके लिए कोई प्रतिस्थापन नहीं है $var = isset($var) ? $var : 'default value'; यह कहता है कि उत्तर में ... बस इसे फिर से इंगित करने वाले किसी के लिए भी इसे इंगित करता है। :
ब्रैड

6
क्या $ var = @ $ var?: 'डिफ़ॉल्ट मान' करना बुरा है; यदि हां, तो क्यों? यह देखते हुए कि केवल "त्रुटि" हो सकती है कि $ var सेट नहीं है, और हमें परवाह नहीं है यदि $ var सेट नहीं है ...
Codemonkey

8

सभी महान जवाब के लिए धन्यवाद!

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

function set_if_defined(&$var, $test){
    if (isset($test)){
        $var = $test;
        return true;
    } else {
        return false;
    }
}

function set_unless_defined(&$var, $default_var){
    if (! isset($var)){
        $var = $default_var;
        return true;
    } else {
        return false;
    }
}

function select_defined(){
    $l = func_num_args();
    $a = func_get_args();
    for ($i=0; $i<$l; $i++){
        if ($a[$i]) return $a[$i];
    }
}

उदाहरण:

// $foo ||= $bar;
set_unless_defined($foo, $bar);

//$foo = $baz || $bletch
$foo = select_defined($baz, $bletch);

मुझे यकीन है कि इन पर सुधार किया जा सकता है।


7

पुराने PHP संस्करणों के साथ संगत रहने के लिए एक सामान्य मुहावरा है:

 $var = $bool   or   $var = "default";
 // If I use it, then only with excessive spaces for clarity.

यह उन मूल्यों के लिए काम करता है जिनका मूल्यांकन बूलियन संदर्भ में किया जा सकता है। यहाँ लाभ यह है कि यह आपको यह भी बताता है कि डिबग e_notice वैरिएबल अपरिभाषित होना चाहिए।


$bool ? $bool : "default"यदि $boolपरिभाषित नहीं है, तो क्या कोई नोटिस उत्सर्जित नहीं किया जाता है
BoltClock

ज़रूर, वही। मैंने मान लिया कि ओपी का जिक्र है isset($var) ? $var : DEFAULT। लेकिन लगता है जैसे वह उन्हें वैसे भी दूर करना चाहता है।
मारियो

6

PHP में पहले से 7. *, एक का उपयोग कर सकते हैं? एक अपरिभाषित चर के लिए त्रुटियों के साथ स्थानीय रूप से एक दबा दिया @:

$foo = @$bar ?: $baz;

0

यह issetमामले के लिए एक और अच्छा प्रारूप है

isset($foo) || $foo= $bar;

एक और सरल तरीका है और आपको अधिक नियंत्रण देगा क्योंकि आप एक ही समय में अधिक परिस्थितियों को जोड़ सकते हैं और किसी अन्य चर को असाइन कर सकते हैं

$foo = (isset($oData['foo']))?$bar['foo']:'default value';


0

एक संभावित समाधान: defaultFor ()

जब तक हमारे पास एक कारखाना समाधान नहीं है (जो वास्तव में बहुत कष्टप्रद है), मैं निम्नलिखित छोटे सहायक की सिफारिश करूंगा। यह ज्यादातर मामलों में काम करता है:


    function defaultFor(&$x,$default=null) {
        if(!isset($x)) $x = $default;
    }

    //--------------------  Now you can do this: --------------

    defaultFor($a,"Jack");  // if $a is not set, it will be "Jack"
    defaultFor($x);         // no more notices for $x but keep it !isset

मुझे आशा है कि यह वही है जो आप हासिल करना चाहते थे। यदि आप इसे बिना किसी परिवर्तनशील चर के साथ उपयोग करते हैं, तो यह आपको कोई नोटिस नहीं देगा और यह काफी सुविधाजनक है। निश्चित रूप से इसकी एक खामी है: डिफ़ॉल्ट मान हमेशा पहले से गणना की जाती है, इसलिए इसे किसी दूसरे पैरामीटर के रूप में भारी चीज के साथ उपयोग न करें, जैसे कि file_get_contents या कुछ और। उन मामलों में, आप परेशान होने से बेहतर हैं।

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