【问题标题】:Shortest way to assign a default value to a variable?为变量分配默认值的最短方法?
【发布时间】:2011-04-15 06:49:09
【问题描述】:

如果存在,我现在可以使用 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。我想知道是否有办法像我的第二个示例一样编写它?

【问题讨论】:

  • 我不懂 PHP,但你肯定可以编写一个辅助函数,例如 GetCookieOrDefault,调用方式如下:$default_carat_min = GetCookieOrDefault("diamond-search_caratMin", "0.25")

标签: php variable-assignment default-value


【解决方案1】:

PHP 5.3 添加了ternary operator 的简写形式:

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

如果左侧为真,则计算左侧,否则计算右侧。

但是,在 5.3 之前,您必须使用长格式。

【讨论】:

  • 该死的,我错过了! @ 5.2.14
  • 请注意,当给定的 cookie 不存在时,此代码将引发错误(确切地说是 E_NOTICE)。
  • 可以用isset()轻松修复
  • @Crozin 是的,但所有 OP 的示例也是如此。顺便说一句,通知不是错误。
  • $def = (isset($_COOKE['dimaond'])) ? $_COOKIE['dimaon'] : 0.25;
【解决方案2】:

你可以使用一个函数:

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

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

【讨论】:

    【解决方案3】:

    为避免使用电子通知:

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

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

    【讨论】:

    • 谢谢!我喜欢这种方法,因为它看起来最干净。 +1
    【解决方案4】:

    我认为这个问题是主观的。我个人认为最好是冗长的,并且您的第一个表单没有任何问题,因为您的代码的作用是完全显而易见的。

    您可以使用的行数或大小不受限制。真的是省了几个键就省了这么多吗?

    如果这确实是个问题,也许首先尝试减少您使用的变量数量会是一个更好的解决方案

    【讨论】:

    • 如果我问过哪种方法更好,那只会是主观的。但是,以一种方式与另一种方式比较的字符长度没有任何主观性。
    • 是的。长度无关紧要,代码“可读性”比保存 50 个字符更重要。
    • @Galen,我是否应该这样做可能是一个主观问题。但这不是我问的问题。如果我这么问,人们就会整天争论不休。但我问哪条路最短。这有一个可以衡量的答案。关于一个答案是否比另一个答案有更多字符没有争议。
    • @Galan,我不想听起来粗鲁,但我认为你是。在我看来,序列中的 20 个短单行赋值比 20 个 if 语句更容易阅读。这就是我想这样做的原因,是为了让代码更容易让我自己理解。但是,我认为这种方式更容易阅读代码是主观的,而你告诉我另一种方式更容易阅读也是主观的。我不是为了主观讨论哪个更好而开始这个线程的。我开始写它是为了得到一个关于如何以我觉得更容易理解的方式编写它的具体答案。
    【解决方案5】:

    我同意 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;
    

    【讨论】:

    • +1 建议使用配置文件来定义默认值。
    【解决方案6】:

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

    您可以先定义一组默认值,然后方便地循环遍历它。这个例子只检查 $_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 数组,这样您就可以轻松地以可读和易于编辑的方式集中您的默认值。我不会在这里展示,因为我认为这超出了这里的要求。

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

    【讨论】:

      猜你喜欢
      • 2013-02-17
      • 2015-01-19
      • 2019-07-02
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多