2015-01-04 67 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