PHP में C#का अशक्त coalescing ऑपरेटर(??)




ternary-operator null-coalescing-operator (5)

वहाँ एक ternary ऑपरेटर या PHP की तरह है जो काम करता है ?? C का #?

?? C # में साफ और छोटा है, लेकिन PHP में आपको कुछ ऐसा करना होगा:

// This is absolutely okay except that $_REQUEST['test'] is kind of redundant.
echo isset($_REQUEST['test'])? $_REQUEST['test'] : 'hi';

// This is perfect! Shorter and cleaner, but only in this situation.
echo null? : 'replacement if empty';

// This line gives error when $_REQUEST['test'] is NOT set.
echo $_REQUEST['test']?: 'hi';

wiki.php.net/rfc/isset_ternary , ( ?? ) को PHP 7 में स्वीकार और कार्यान्वित किया गया है। यह उस में छोटे टर्नरी ऑपरेटर ( ?: :) से अलग है ?? E_NOTICE को E_NOTICE जो कि किसी सरणी तक पहुंचने का प्रयास करते समय अन्यथा होता है जहां इसकी कुंजी नहीं है। RFC में पहला उदाहरण देता है:

$username = $_GET['user'] ?? 'nobody';
// equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

ध्यान दें कि ?? ऑपरेटर को E_NOTICE को रोकने के लिए isset के मैनुअल आवेदन की आवश्यकता नहीं है।


?? सी # में बाइनरी है, टर्नरी नहीं। और यह PHP 7 से पहले PHP में कोई तुल्यता नहीं है।


एक समान ऑपरेटर PHP 5.6 के रूप में मौजूद नहीं है, लेकिन आप एक ऐसा कार्य कर सकते हैं जो समान व्यवहार करता है।

/**
 * Returns the first entry that passes an isset() test.
 *
 * Each entry can either be a single value: $value, or an array-key pair:
 * $array, $key.  If all entries fail isset(), or no entries are passed,
 * then first() will return null.
 *
 * $array must be an array that passes isset() on its own, or it will be
 * treated as a standalone $value.  $key must be a valid array key, or
 * both $array and $key will be treated as standalone $value entries. To
 * be considered a valid key, $key must pass:
 *
 *     is_null($key) || is_string($key) || is_int($key) || is_float($key)
 *         || is_bool($key)
 *
 * If $value is an array, it must be the last entry, the following entry
 * must be a valid array-key pair, or the following entry's $value must
 * not be a valid $key.  Otherwise, $value and the immediately following
 * $value will be treated as an array-key pair's $array and $key,
 * respectfully.  See above for $key validity tests.
 */
function first(/* [(array $array, $key) | $value]... */)
{
    $count = func_num_args();

    for ($i = 0; $i < $count - 1; $i++)
    {
        $arg = func_get_arg($i);

        if (!isset($arg))
        {
            continue;
        }

        if (is_array($arg))
        {
            $key = func_get_arg($i + 1);

            if (is_null($key) || is_string($key) || is_int($key) || is_float($key) || is_bool($key))
            {
                if (isset($arg[$key]))
                {
                    return $arg[$key];
                }

                $i++;
                continue;
            }
        }

        return $arg;
    }

    if ($i < $count)
    {
        return func_get_arg($i);
    }

    return null;
}

उपयोग:

$option = first($option_override, $_REQUEST, 'option', $_SESSION, 'option', false);

यह प्रत्येक चर की कोशिश करेगा जब तक कि यह एक ऐसा न हो जो संतोषजनक हो isset() :

  1. $option_override
  2. $_REQUEST['option']
  3. $_SESSION['option']
  4. false

यदि 4 नहीं थे, तो यह null

नोट: एक सरल कार्यान्वयन है जो संदर्भ का उपयोग करता है, लेकिन यह 3v4l.org/9vmFR लिए साइड इफेक्ट 3v4l.org/9vmFR । यह तब समस्याग्रस्त हो सकता है जब किसी सरणी का आकार या सत्यता मायने रखती है।


PHP 7 नल कोलेसस ऑपरेटर को जोड़ता है:

// 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';

आप php के टेनेरी ऑपरेटर लिखने के छोटे तरीके को भी देख सकते हैं ?: (php> = 5.3 केवल)

// Example usage for: Short Ternary Operator
$action = $_POST['action'] ?: 'default';

// The above is identical to
$action = $_POST['action'] ? $_POST['action'] : 'default';

और C # से आपकी तुलना उचित नहीं है। "PHP में आपको कुछ ऐसा करना होगा" - यदि आप किसी गैर-मौजूद सरणी / शब्दकोश आइटम तक पहुंचने का प्रयास करते हैं, तो C # में आपके पास एक रनटाइम त्रुटि भी होगी।


मैं फ़ंक्शन का उपयोग करता हूं। जाहिर है कि यह ऑपरेटर नहीं है, लेकिन आपके दृष्टिकोण से साफ लगता है:

function isset_or(&$check, $alternate = NULL)
{
    return (isset($check)) ? $check : $alternate;
}

उपयोग:

isset_or($_REQUEST['test'],'hi');




php-7