52

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

6 回答 6

69

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# 中,如果你尝试访问一个不存在的数组/字典项,你也会遇到运行时错误。

于 2011-09-02T03:00:08.950 回答
52

合并运算符( ??) 已在PHP 7中被接受和实现。它与短三元运算符( ?:) 的不同之处在于,??它将抑制E_NOTICE在尝试访问没有键的数组时会发生的情况。RFC 中的第一个示例给出:

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

请注意,??操作员不需要手动应用isset来防止E_NOTICE.

于 2014-10-01T13:39:15.113 回答
10

我使用函数。显然它不是运营商,但似乎比你的方法更干净:

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

用法:

isset_or($_REQUEST['test'],'hi');
于 2013-09-08T16:22:15.217 回答
6

在 PHP 7 之前,没有。如果您需要参与isset,使用的模式是isset($var) ? $var : null。没有?:包含isset.

于 2011-09-02T03:03:17.860 回答
4

??在 C# 中是二进制的,而不是三进制的。它在 PHP 7 之前的 PHP 中没有等价物。

于 2011-09-02T03:02:39.950 回答
1

自 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.

注意:有一个使用引用的更简单的实现,但它具有将测试项设置为 null 如果它不存在的副作用。当数组的大小或真实性很重要时,这可能会出现问题。

于 2013-07-14T00:34:46.583 回答