2015-01-04 76 views
0

我有一个FileLocations类,它将路径存储到特定文件。验证数组中的多个项目

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()); 

它只做第一个文件的验证和甚至不reconize有在参数传递第二个文件。

它也不会引发异常。

问题

  • 这是如何来,它只是reconizes在验证 一个文件,而不是抛出的甚至不存在 第二个文件例外吗?

  • 我该如何使它能够在areValidFiles函数中传递更多参数 ?

+0

的'返回is_file()'导致在foreach到所述第一时间之后中止。删除这是解决这个问题的第一步。当它发现一个不存在的文件时会发生什么? – Bjorn 2015-01-04 13:51:28

+0

@Bjorn它应该在__construct方法中抛出一个异常。删除它意味着什么? – Bas 2015-01-04 13:52:04

+0

尝试返回一个数组与布尔值在areValidFiles() – 2015-01-04 13:52:45

回答

1

areValidFiles功能应该被改写:

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

和我所做的不一样吗?除了用假来扭转真实? – Bas 2015-01-04 13:55:33

+1

不,它不一样。 – 2015-01-04 13:56:04

+0

那我还可以这么做吗? :'return!is_file($ file)'? – Bas 2015-01-04 13:56:34

1

I`d做这样的事情:

/** 
    * @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 
} 
+0

谢谢,但我真的不喜欢循环布尔的数组的方式。我会坚持用u_mulder的方式:) – Bas 2015-01-04 14:01:45

+0

好吧,但这样你就知道哪个文件是无效的:) – 2015-01-04 14:02:44

+0

确实。但我真的不需要:) – Bas 2015-01-04 14:05:47

1

添加一个观察者来你的功能代替o F使用returnis_file

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; 
} 
+0

这也不错,但我preffer @u_mulder的回答:) – Bas 2015-01-04 13:59:40