0
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) 吗?(string) true : (bool) false 以这种方式工作?如,它是否会评估true函数是否输出 a string,它是否会评估false函数是否为bool

4

3 回答 3

2

没有。您试图在if(){}else{}语句中进行类型调整(切换变量的数据类型)。

正确的方法是将您的 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()andis_string()函数。如果您的函数file_get_contents_new返回一个字符串,它将评估为 true,并检查是否$this->OO_active为布尔值。如果您的file_get_contents_new函数返回一个布尔值(意味着它不是字符串),它将立即执行您的else{}语句,因为您的两个if条件都必须为真(因为&&/and运算符),并且如果其中一个条件返回假,或者破坏链,它将移动到else语句。

于 2013-08-03T18:11:27.593 回答
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,因为它具有相同的值(但类型不同(字符串/布尔值)

于 2013-08-03T18:06:35.503 回答
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 语句中的三元运算符应该可以工作。但它很难测试、调试、维护,并且会降低代码的可读性。我不喜欢这样使用它。

于 2013-08-03T18:07:31.823 回答