避免在如下语句中重复代码:isset($_GET['foo']['bar']) ?$_G


Avoid duplicate code in statements like: isset($_GET['foo']['bar']) ? $_GET['foo']['bar'] : NULL;

为了在PHP中读取未知变量,我经常使用以下代码:

$bar = isset($_GET['foo']['bar']) ? $_GET['foo']['bar'] : NULL;

我不喜欢把变量名写两次。它看起来很丑,而且对于这样的日常任务来说太长了。

你知道更好的解决办法吗?仅使用@运算符或抑制通知根本不是选项(不良做法,速度慢)。
通过引用自定义函数和变量,在某种程度上可以:

function ifset(&$value)
{
    if(isset($value)) return $value;
}
$bar = ifset($_GET['foo']['bar']); // $_GET is empty

然而,这会无声地创建新的不需要的变量,名称为/path。var_dump($_GET)将打印:

array(1) {
  ["foo"]=>
  array(1) {
    ["bar"]=>
    NULL
  }
}

虽然这不能完全解决您的问题,但在某些情况下,您可以使用extract($_GET);

<?php
/* Suppose that $var_array is an array returned from
   wddx_deserialize */
$size = "large";
$var_array = array("color" => "blue",
                   "size"  => "medium",
                   "shape" => "sphere");
extract($var_array, EXTR_PREFIX_SAME, "wddx");
echo "$color, $size, $shape, $wddx_size'n";
?>

使用:"eval(foo,bar")参见php手册中的:eval.

重新设计函数的另一种方法是创建一个递归函数,该函数将所有set键作为名称添加到数组中,然后简单地使用in_array()函数进行检查。如果找到,返回值

最后PHP7带来了一个解决方案。是啊!合并操作符。

$bar = $_GET['foo']['bar'] ?? NULL;

如果??之前的值存在并且不是NULL,则返回该值,否则将从??后面获取回退值。我喜欢!