为变量分配默认值的最短方法?

时间:2010-09-21 15:36:04

标签: php variable-assignment default-value

我现在有这个使用cookie值,否则使用默认值:

$default_carat_min = "0.25";
if($_COOKIE["diamond-search_caratMin"])
{
    $default_carat_min = $_COOKIE["diamond-search_caratMin"];
}

我将不得不用很多变量来做这件事,而且它会变得非常混乱/丑陋。所以我试图想出一个更清晰的写作方式。

我试过了:

$default_carat_min = $_COOKIE["diamond-search_caratMin"] | "0.25";

哪个不起作用。

我可以这样做:

$default_carat_min = $_COOKIE["diamond-search_caratMin"] ? $_COOKIE["diamond-search_caratMin"] : "0.25";

但我不喜欢我必须重复$_COOKIE两次。我想知道是否有办法写出类似我的第二个例子?

6 个答案:

答案 0 :(得分:20)

PHP 5.3为ternary operator添加了一个简短形式:

$default_carat_min = $_COOKIE["diamond-search_caratMin"] ?: "0.25";

如果左侧为真,则评估左侧,否则评估为右侧。

然而,在5.3之前,你必须使用长格式。

答案 1 :(得分:4)

您可以使用以下功能:

function set_default(&$var, $default) {
    return isset($var) ? $var : $default;
}

$default_carat_min = set_default($_COOKIE["diamond-search_caratMin"], "0.25");

答案 2 :(得分:2)

我认为这个问题是主观的。我个人认为最好是冗长而且你的第一个表格没有任何问题,因为你的代码完全明显。

这并不像你可以使用的线数或尺寸限制。你真的通过节省一些击键来节省那么多吗?

如果确实存在问题,或许尝试减少首先使用的变量数量将是更好的解决方案

答案 3 :(得分:2)

我同意Cfreak的回答。我宁愿代码“显而易见”。

要添加到那个,虽然你不想为0.25(或其他值)的每个实例搜索你的代码所以我建议你创建一个配置文件,如果你没有,并添加这个...

DEFINE( 'DEFAULT_CARAT_MIN', 0.25 );
// other defaults

然后包括配置文件和

if($_COOKIE["diamond-search_caratMin"])
{
    $default_carat_min = $_COOKIE["diamond-search_caratMin"];
}
else {
    $default_carat_min = DEFAULT_CARAT_MIN;
}

你也可以使用三元运算符

$default_carat_min = $_COOKIE["diamond-search_caratMin"] ? $_COOKIE["diamond-search_caratMin"] : DEFAULT_CARAT_MIN;

答案 4 :(得分:1)

为避免使用电子通知:

$default_carat_min = @$_COOKIE["diamond-search_caratMin"] ?: "0.25";

请注意使用@来消除错误消息。

答案 5 :(得分:0)

这个问题包含一个提示,即必须检查相当多的变量以确保它们具有默认值,并且没有人提到这一点。这就是我现在要做的事情:

您可以先定义一个默认值数组,然后方便地循环。这个例子只检查$ _COOKIE全局:

$defaults = Array(
    'diamond-search_caratMin' => "0.25"
    ,'diamond-search_caratMax' => "2.00"
);
foreach ($defaults as $dk => $dv) {
    if (!isset($_COOKIE[$dk])) {
        $_COOKIE[$dk] = $dv;
    }
}

如果您计划为多个变量和不同类型设置默认值,可以使用以下代码:

$defaults = Array(
    '_COOKIE' => Array(
        'diamond-search_caratMin' => "0.25"
        , 'diamond-search_caratMax' => "2.00"
    )
    , 'myOtherArray' => Array(
        'value_1' => 10
        , 'value_2' => 20
    )
    , 'myString' => 'Hello'
    , 'myFloat' => 1.0
);
foreach ($defaults as $vk => $vv) {
    if (is_array($vv)) {
        if (!isset($$vk)) {
            $$vk = Array();
        }
        foreach ($vv as $dk => $dv) {
            if (!isset($$vk[$dk])) {
                $$vk[$dk] = $dv;
            }
        }
    } else {
        if(!isset($$vk)) {
            $$vk=$vv;
        }
    }
}

下一步是通过解析一些ini文件来生成$ defaults数组,这样您就可以轻松地以可读且易于编辑的方式集中默认值。我不打算在这里展示,因为我认为它超出了这里的要求。

希望有人喜欢这个....