三元运算符如果为bool则求值为true;如果为bool则求值为false

时间:2013-08-03 17:57:40

标签: php

function file_get_contents_new($url, $wait = 3) {
    if (http_response($url, '200', $wait)) {
        return file_get_contents($url);
    } else {
        return FALSE;
    }
}
function OO_chart($query_stub, $length)
    {
        $key = $this->OO_charts_key;
        $url_api = "https://api.oocharts.com/v1/query.jsonp?query={$query_stub}&key={$key}&start={$length}";
        $json = file_get_contents_new($url_api);
        if (file_get_contents_new($url_api) ? (string) true : (bool) false && (bool) $this->OO_active) {
            return json_decode($json, TRUE);
        } else {
            $msg = new Messages();
            $msg->add('e', 'JSON error. Check OOcharts api.');
            redirect('index.php');
        }
    }

file_get_contents_new($ url_api)? (字符串)true :( bool)这样的假工作? 如果函数输出true,它将评估为string, 如果函数是false,它会评估为bool吗?

3 个答案:

答案 0 :(得分:2)

即可。您尝试在if(){}else{}语句中键入juggle(切换变量的数据类型)。

执行此操作的正确方法是将if语句更改为以下内容:

if (is_string(file_get_contents_new($url_api)) && is_bool($this->OO_active)) {
   return json_decode($json, TRUE);
} else {
   $msg = new Messages();
   $msg->add('e', 'JSON error. Check OOcharts api.');
   redirect('index.php');
}

现在,正如您所见,我在PHP中使用了is_bool()is_string()函数。如果函数file_get_contents_new返回一个字符串,它将评估为true,并检查$this->OO_active是否为布尔值。如果您的file_get_contents_new函数返回一个布尔值(意味着它不是一个字符串),它将立即执行您的else{}语句,因为您的if条件都必须为真(因为{ {1}} / &&运算符),如果其中一个条件返回false,或者断开链,它将移至and语句。

答案 1 :(得分:1)

不,那不行。翻译回正常if / else它更容易解释为什么这不起作用:

if( !file_get_contents($file) ){
    // the file_get_contents function returned false, so something went wrong
}
else{
    // the if-condition was not met, so the else will do its job
    // The problem is that we got the content in the if-condition, and not in a variable
    // therefor we can not do anything with its contents this way
    echo "It did work, but I have no way of knowing the contents";
}

解决方案可能是这样的:

$content = file_get_contents($file);
$content = $content===false ? 'No content' : $content; // rewrite if file_get_contents returns false

对三元检查要小心,使用三等号。在一些奇怪的情况下,文件的内容可能是“错误的”。检查$content==false是否会返回true,因为它具有相同的值(但不是相同的类型(字符串/布尔值)

答案 2 :(得分:0)

file_get_contents_new()返回读取数据或失败时返回FALSE。

http://php.net/manual/en/function.file-get-contents.php

那为什么会让事情复杂化?这应该工作。但只有一种方法可以找到......

    $contents = file_get_contents_new($url_api);

    if (($contents!==false) && (bool) $this->OO_active) {
         return json_decode($json, TRUE);
    } 

我也不喜欢(bool)作业。那个参数不应该是boolean吗?

并回答你的问题 - 是的,if语句中的三元运算符应该有效。但是,测试,调试,维护和使代码的可读性降低是很困难的。我不喜欢这样使用它。