代码之家  ›  专栏  ›  技术社区  ›  JD Isaacks

为变量指定默认值的最短方法?

  •  4
  • JD Isaacks  · 技术社区  · 14 年前

    我现在有权使用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 回复  |  直到 8 年前
        1
  •  20
  •   Daniel Vandersluis    14 年前

    php 5.3为 ternary operator :

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

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

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

        2
  •  4
  •   Toto    14 年前

    您可以使用函数:

    function set_default(&$var, $default) {
        return isset($var) ? $var : $default;
    }
    
    $default_carat_min = set_default($_COOKIE["diamond-search_caratMin"], "0.25");
    
        3
  •  2
  •   Cfreak    14 年前

    我认为这个问题是主观的。我个人认为最好是冗长一些,而且第一个表单没有任何问题,因为您的代码所做的事情是非常明显的。

    这并不是说你的线条数量或尺寸有限。你真的节省了那么多通过节省几个关键的笔触?

    如果这真的是一个问题,也许在第一时间减少你使用的变量的数量会是一个更好的解决方案。

        4
  •  2
  •   Galen    14 年前

    我同意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;
    
        5
  •  1
  •   Nissa TheRealPir    8 年前

    为避免使用电子通知:

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

    注意使用 @ 使错误信息保持静音。

        6
  •  0
  •   Andreas    10 年前

    这个问题包含了一个提示,即必须检查大量变量以确保它们有一个默认值,但没有人提到这个值。这就是我现在要做的:

    您可以首先定义一个默认值数组,并方便地循环使用它。此示例只检查$_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数组,这样您就可以以一种可读且易于编辑的方式轻松地集中默认值。我不会在这里展示这一点,尽管我认为这超出了这里的要求。

    希望有人喜欢…