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




coding-style conditional-operator (4)

सरणी से सावधान रहें। हमें एक जांच चर के बाद लिखना होगा ? , इसलिये:

  $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

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

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

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

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

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

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


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


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

छद्म कोड में,

foo = bar ?: baz;

मोटे तौर पर हल करता है

foo = bar ? bar : baz;

या

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

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

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

foo = foo ?: bar;

अगर foo शून्य या गलत है तो यह bar को foo को असाइन करेगा, अन्यथा यह अपरिवर्तित 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'
?>

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


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

यदि आपको लगता है कि आपकी कुछ फाइलें 'इनकार करने' को ज़ेंड ओपेकैच में कैश करने के लिए हैं, तो यह कारणों में से एक हो सकता है ... उम्मीद है कि इससे मदद मिलती है!





language-construct