【问题标题】:Best practice to return a variable when you're not sure if it exists不确定变量是否存在时返回变量的最佳实践
【发布时间】:2018-10-22 07:30:54
【问题描述】:

假设我想返回一个对象,其中包含有关请求页面的客户端的信息。我以 PHP 为例。像这样的:

public function getClientInformation(){
    return [
        "ip" => $_SERVER["REMOTE_ADDR"],
        "request_uri" => $_SERVER["REQUEST_URI"],
        "refferer" => $_SERVER["HTTP_REFERER"]
    ];
}

问题是:不知道是否设置了referrer。我如何正确检查它是否已设置,如果没有则返回 false?这是我想出的,但我不喜欢它:

public function getClientInformation(){
    $referrer = false;
    if(array_key_exists("HTTP_REFERER", $_SERVER)){
        $referrer = $_SERVER["HTTP_REFERER"];
    }

    return [
        "ip" => $_SERVER["REMOTE_ADDR"],
        "request_uri" => $_SERVER["REQUEST_URI"],
        "refferer" => $referrer
    ];
}

感谢您的帮助

【问题讨论】:

  • 我建议array_key_exists() 替代isset()。它们是相似的,但在某些情况下它们是不同的。另外,为什么不从结果数组中删除 refferer 键呢?毕竟价值不是false,没有价值!
  • @UlrichEckhardt 好点,但是当我这样做时出现错误。
  • 在您的情况下,我通常只使用:"refferer" => (isset($_SERVER["HTTP_REFERER"])) ? $_SERVER["HTTP_REFERER"] : false,我觉得它更容易阅读。虽然我不认为你有什么是错的。

标签: php software-quality


【解决方案1】:
"refferer" => $_SERVER["HTTP_REFERER"] ?? false; // PHP 7 
"refferer" => isset($_SERVER["HTTP_REFERER"]) ?: $_SERVER["HTTP_REFERER"] : false; // < PHP 7

【讨论】:

    【解决方案2】:

    php 中,您可以使用Error Control Operators,如下所示:

    public function getClientInformation(){
        return [
            "ip" => $_SERVER["REMOTE_ADDR"],
            "request_uri" => $_SERVER["REQUEST_URI"],
            "refferer" => @$_SERVER["HTTP_REFERER"]
        ];
    }
    

    如果有警告(以防调用未定义的索引)或错误会返回 false,但要确定在哪里使用它。

    或者您可以使用内联 ? 运算符:

    public function getClientInformation(){
        return [
            "ip" => $_SERVER["REMOTE_ADDR"],
            "request_uri" => $_SERVER["REQUEST_URI"],
            "refferer" => isset($_SERVER["HTTP_REFERER"])? $_SERVER["HTTP_REFERER"] : false
        ];
    }
    

    php 7.0 中有null coalesce operator ??:

    public function getClientInformation(){
        return [
            "ip" => $_SERVER["REMOTE_ADDR"],
            "request_uri" => $_SERVER["REQUEST_URI"],
            "refferer" => $_SERVER["HTTP_REFERER"] ?? false
        ];
    }
    

    这是上面代码的简写。

    【讨论】:

    • 一般的偏好是永远不要使用错误控制运算符。抑制错误不是修复错误的正确方法。带有抑制错误的代码仍然是带有错误的代码,它可以并且将会产生意想不到的结果。根据提供的链接,空合并运算符是 ?? 而不是 ?:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2021-11-26
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多