验证数组中的多个项目

Validation of multiple items in an array

我有一个 FileLocations class 存储特定文件的路径。

class FileLocations
{
    /**
     * @var array
     */
    private $files = [];

    /**
     * @param array $files
     *
     * @throws \Exception
     */
    public function __construct (array $files) {
        if (!$this->areValidFiles($files)) {
            throw new Exception;
        }
        $this->files = $files;
    }

    /**
     * @param $files
     *
     * @return bool
     */
    private function areValidFiles (array $files) {
        foreach ($files as $file) {
            return is_file($file);
        }
        return false;
    }

    /**
     * @return array
     */
    public function getFiles () {
        return $this->files;
    }
}

我想验证每个文件(使用 is_file),所以我创建了 areValidFiles 函数并遍历它获取的每个数组索引。它对每个数组项进行检查。

当我像这样运行这段代码时:

$fileLocations  = new FileLocations(['doesExist.js', 'doesnotExist.js']);
var_dump($fileLocations->getFiles());

它只对第一个文件进行验证,甚至没有确认在参数中传递了第二个文件。

它也不会抛出异常。

问题

您的 areValidFiles 函数应该重写:

private function areValidFiles (array $files) {
    foreach ($files as $file) {
        if (!is_file($file))
            return false;
    }
    return true;
}

我会做类似的事情:

   /**
     * @param $files
     *
     * @return bool
     */
    private function areValidFiles (array $files) {
        $files = array();
        foreach ($files as $file) {
            $files[$file] = is_file($file);
        }
        return $files;
    }
$fileLocations  = new FileLocations(['doesExist.js', 'doesnotExist.js']);
$fileLocations['doesExist.js'] //true
$fileLocations['doesnotExist.js'] //false

或使用例外:

    private function areValidFiles (array $files) {
        foreach ($files as $file) {
            if(!is_file($file)){
                throw new Exception('Invalid file: '.$file);
            }
        }
    }

try{
    $fileLocations  = new FileLocations(['doesExist.js', 'doesnotExist.js']);
} catch (Exception $e)
{
    //do something
}

is_file

之后向您的函数添加观察者而不是使用 return
private function areValidFiles (array $files) {
    $are_all_files_valid = true;
    foreach ($files as $file) {
        if (!is_file($file)) {
            $are_all_files_valid = false;
            break;
        }
    }
    return $are_all_files_valid;
}