File_get_contents 当文件不存在时不评估为 false

File_get_contents not evaluating to false when file does not exist

我正在尝试测试代码中的异常。

public function testGetFileThrowsException(){
    $this->expectException(FileNotFoundException::class);
    $file = "db.json";
    $this->review->getData($file);
}

"db.json" 文件不存在。我的目标是让 getData() 文件抛出 FileNotFoundException。这是 getData() 代码:

public function getData($path){

    if(file_get_contents($path) === false){
        throw new FileNotFoundException;
    }
    return $file;
}

问题是,file_get_contents 函数 returns:

不是评估为 False 并抛出异常
1) CompanyReviewTest::testGetFileThrowsException
file_get_contents(db.json): failed to open stream: No such file or directory

所以测试没有 运行 成功。关于为什么会发生这种情况的任何想法?

您有 2 种解决方案,最糟糕的一种是像那样隐藏错误

public function getData($path){

    if(@file_get_contents($path) === false){
        throw new FileNotFoundException;
    }
    return $file;
}

或者检查文件是否存在(我猜是更好的解决方案)

public function getData($path){

if(file_exists($path) === false){
    throw new FileNotFoundException;
}
return $file;
}

file_get_contents() 生成一个 E_WARNING 级别的错误(无法打开流),这是您要抑制的错误,因为您已经在处理它时出现异常 class。

您可以通过在file_get_contents()前面添加PHP's error control operator @来抑制此警告,示例:

<?php

$path = 'test.php';
if (@file_get_contents($path) === false) {
    echo 'false';
    die();
}

echo 'true';

?>

以上回显错误,没有 @ 运算符它 returns E_WARNING 和回显错误。警告错误可能会干扰您的 throw 函数,但没有看到代码很难说。