【问题标题】:PHP variable "default value"PHP变量“默认值”
【发布时间】:2012-06-25 01:32:36
【问题描述】:

我想从会话中获取一个值,但如果未定义则使用默认值。当然,我想绕过 PHP 通知。

你可以写一个函数来做这个

function get(&$var, $default){
    if(isset($var)) return $var;
    return $default;
}

echo get($foo, "bar\n");
$foobar = "foobar";
echo get($foobar, "ERROR");

Example in action

有没有办法在每个文件中都不定义这个函数?

【问题讨论】:

    标签: php variables default-value


    【解决方案1】:

    您可以在一个脚本中定义它,然后在您的其他脚本中require_once 该脚本

    你也可以只使用三元运算符:

    $myVar = isset($var)?$var:$default;
    

    【讨论】:

    • 是的——你打算将它添加到语言中吗?
    • 当然(对我来说)这是不可能的,但我认为可能有一种语言内置替代方案
    • 你可以在几个不同的项目中包含相同的脚本。不过,我可能在这里错过了问题的精神。
    • 三元运算符呢?我只是在我的答案中添加了一个示例。
    【解决方案2】:

    使用这个简洁的替代方案:

    isset($myVar) || $myvar=$default;
    

    || 操作符短路,如果第一个操作符被评估为真,它将不会评估第二个操作符。

    【讨论】:

    • 请说明您认为您的代码解决问题的原因。
    【解决方案3】:

    使用更少的代码来做你需要的事情。

    您无需使用_?_:_ 格式再次指定变量。

    echo $var?:"default";
    

    是一样的

    echo $var?$var:"default";
    

    现在就空支票而言,您可以使用@ 将通知静音,我不确定技术后果,但您在使用此格式时已经在进行自己的检查:

    echo @$non_existing_var?:"default";
    

    一些例子:

    <?php
    
        $nope = null;
        $yup = "hello";
        echo ($nope?:$yup) . "\n" ;
        echo ($yup?:$nope)  . "\n" ;
    
        $items = [ 'one', 'two', false, 'three', 'four', null ];
    
        foreach($items as $item):
            echo($item?:"default shown (".var_export($item,true).")")."\n";
        endforeach;
    
        echo(@$non_existing?:"default for non-existant variable!");
    
    ?>
    

    输出:

    $ php variabledefault.php
     hello
     hello
     one
     two
     default shown (false)
     three
     four
     default shown (NULL)
     default for non-existant variable!%                                                                                                                   
    

    【讨论】:

    • 这是不正确的:$v=false; echo $v?:"not set"; 将错误地产生“未设置”
    • 是的,所以这不是问题的答案。问题是“如果未设置变量则显示默认值”,而不是“如果变量计算结果为 false,则显示指定值”
    • "我想从会话中获取一个值,但是如果没有定义就使用默认值。当然我想绕过 PHP 通知。"这可以通过使用(如果未设置“derp”会话变量)完全按照要求实现:print @$_SESSION['derp']?:"default"; 也就是说,是的,如果它为 false,它将返回默认值,但这就是逻辑的工作原理。
    【解决方案4】:

    在这种情况下,您可以使用我的小型库 ValueResolver,例如:

    $myVar = ValueResolver::resolve($var, $default);
    

    别忘了使用命名空间use LapaLabs\ValueResolver\Resolver\ValueResolver;

    还有类型转换的能力,例如如果你的变量的值应该是integer,那么使用这个:

    $id = ValueResolver::toInteger('6 apples', 1); // returns 6
    $id = ValueResolver::toInteger('There are no apples', 1); // returns 1 (used default value)
    

    查看docs 了解更多示例

    【讨论】:

      【解决方案5】:

      从 PHP 7 开始,您现在可以使用 null 合并运算符:

      $var ?? $default
      

      这和你的功能完全一样

      【讨论】:

        【解决方案6】:

        Null coalescing operator 已添加到 PHP 7.0 版中,它的作用是替换

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

        使用较短的版本:

        $username = $_GET['user'] ?? 'nobody';
        

        上面这行代码的作用是检查$_GET['user'] 是否已设置,而不是空值,然后它将分配给$username 变量,如果$_GET['user'] 未设置(因此为空),它将默认为'nobody' 字符串所以$usernamenobody

        您的代码应如下所示:

        echo $foo ?? "bar\n";
        $foobar = "foobar";
        echo $foobar ?? "ERROR";
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-27
          • 2015-01-04
          • 1970-01-01
          • 2011-10-14
          • 2011-09-22
          • 2014-12-15
          • 1970-01-01
          相关资源
          最近更新 更多