- ベストアンサー
PHPで定義されるあるクラスの関数について
お世話になります。自分がいま勉強しているPHP教本の中の、画像ファイルをアップロードするクラスUploadを以下に掲載します。 自分の質問は この中のcheckFile()という関数についてです。 それぞれがtrueまたはfalseを返す3つの関数を続けて実行していますが、すべての戻り値がtrueでなければtrueを返せないはずなのに、ここでは一番最後のcheckType()がtrueであれば前の2つはfalseでも構わないことになってしまいます。それぞれの戻り値である$accept を順次かけ合わせていけば問題ないように思われますが、そうではなくて、それぞれを単純に$accept に代入するだけでよいのでしょうか? 詳しい方、どうかご意見をお聞かせください。 class Upload{ protected $destination; protected $max = 81920; protected $messages = [];// error or success message, to show to the user protected $permitted = ['image/gif', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/webp' ]; // to check if the uploaded file is one of these types public function __construct($path){ if(is_dir($path) && is_writable($path)){ $this->destination = rtrim($path, '/\\').DIRECTORY_SEPARATOR; }else{ throw new \Exception("$path must be a valid, writable directory.") } } public function upload($fieldname){ $uploaded = $_FILES[$fieldname]; if($this->checkFile($uploaded)){ // child function 1 $this->moveFile($uploaded); // child function 2 } } protected function checkFile($file){ // child function 1 $accept = $this->getErrorLevel($file); $accept = $this->checkSize($file); $accept = $this->checkType($file); return $accept; } protected function moveFile($file){ // $file is the same as $uploaded in parent function $success = move_uploaded_file($file['tmp_name'], $this->destination.$file['name']); if($success){ $result = $file['name'] .' was uploaded successfully.'; $this->messages[] = $result; }else{ $this->messages[] = 'Could not upload '.$file['name']; } } public function getMessages(){ return $this->messages; } protected function getErrorLevel($file){ switch($file['error']){ case 0: return true; case 1: case 2: $this->messages[] = $file['name'].' is too big. (max: '.$this->getMaxSize().')'; break; case 3: $this->messages[] = $file['name'].' was only partially uploaded.'; break; case 4: $this->messages[] = 'No file was submitted.'; break; default: $this->messages[] = 'Sorry. There was a problem uploading '.$file['name']; } return false; } protected function checkSize($file){ if($file['error'] == 1 || $file['error'] == 2 ){ return false; }else if($file['size'] == 0){ $this->messages[] = $file['name']. " is an empty file."; return false; }else if($file['size']>$this->max){ $this->messages[] = $file['name']." exceeds the maximum size for a file (". $this->getMaxSize().")"; return false; } return true; } protected function checkType($file){ if(!in_array($file['type'], $this->permitted)){ $this->messages[] = $file['name']." is not permitted type of file."; return false; } return true; } public function getMaxSize(){ return number_format($this->max/1024, 1)." KB"; } }
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>それぞれを単純に$accept に代入するだけでよいのでしょうか? 確かにおかしい気がしますね。 2つ目・3つ目を &= に変えた > $accept = $this->getErrorLevel($file); > $accept &= $this->checkSize($file); > $accept &= $this->checkType($file); にすれば、いずれかでエラーになったならばエラー、と返せるんじゃないかと思います。
お礼